본문 바로가기
알고리즘/SWEA

[Java] SWEA1954_달팽이숫자

by 댕꼬 2022. 3. 12.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제 

 

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.

 

 

풀이

달팽이의 순서는 우->하->좌->상 으로 정해져 있으므로, dx와 dy의 값을 순서에 맞게 정의한다. 

이때 숫자는 총 N*N까지 출력되기 때문에 N*N번만큼 반복문을 돌리고, 배열의 범위를 벗어나거나 갈 자리에 이미 숫자가 있다면, 방향을 바꿔준다. 

이때  dx,dy 의 인덱스 0,1,2,3을 차례로 반복해야 하므로 나머지 연산을 통해 진행한다. 

 

소스코드

import java.util.Scanner;
/*
 * n*n 배열에 달팽이 모양으로 숫자 찍기
 * SWEA 1954. 달팽이 숫자
 */

public class SWEA1954_달팽이숫자 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int tc = sc.nextInt();
		for (int t = 1; t <= tc; t++) {
			int N = sc.nextInt();
			int arr[][] = new int[N][N];
			int dx[] = { 0, 1, 0, -1 }, dy[] = { 1, 0, -1, 0 };	 //우,하,좌,상
			int count = 1;
			int x = 0, y = 0;
			int d = 0; 
			while (count <= N * N) {
				arr[x][y] = count++;
				int nx = x + dx[d];
				int ny = y + dy[d];
				if (nx < 0 || nx >= N || ny < 0 || ny >= N || arr[nx][ny] != 0) {  //경계 벗어나거나, 숫자가 이미 존재하면
					d = (d + 1) % 4;  //방향바꿈  
					nx = x + dx[d];
					ny = y + dy[d];
				}
				x = nx;
				y = ny;
			}
			System.out.printf("#%d\n",t);
			for (int r = 0; r < N; r++) {
				for (int c = 0; c < N; c++)
					System.out.print(arr[r][c] + " ");
				System.out.println();
			}
		}
	}

}
728x90

'알고리즘 > SWEA' 카테고리의 다른 글

[Java] SWEA2805_농작물수확하기  (0) 2022.03.16
[Java] SWEA1873_상호의배틀필드  (0) 2022.03.16
[Java] SWEA1208_Flatten  (0) 2022.03.16
[Java] SWEA2001_파리퇴치  (0) 2022.03.16
[Java] SWEA1289_원재의메모리복구하기  (0) 2022.03.12

댓글