[알고리즘|SWEA] 1954. 달팽이 숫자(D2) Java

영가이·2022년 6월 28일
0
post-thumbnail

[링크] 달팽이숫자

📖문제

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

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

🔍코드(Java)

public static void main(String[] args) throws NumberFormatException, IOException {
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int Tc = Integer.parseInt(br.readLine());
		
		//오,하,좌,상 순서로 방향배열 만들기
		int dx[] = {0,1,0,-1};
		int dy[] = {1,0,-1,0};
		
		for (int tc = 1; tc <= Tc; tc++) {
			int N = Integer.parseInt(br.readLine());
			
			//N*N 크기의 2차원배열 생성
			int arr[][] = new int[N][N];
			boolean visit[][] = new boolean[N][N];
			
			for (int i = 0; i < N; i++) {
				Arrays.fill(visit[i], false);
			}

			//빈 칸을 다 채울때까지 
			int dir = 0;
			int x = 0;
			int y = 0;	
			for (int i = 1 ; i <= N*N; i++) {
				
				//System.out.println(x + "," + y + " : "+ i);
				//정수 입력 , 방향표시
				arr[x][y] = i;
				visit[x][y] = true;
				
				//다음칸 갈수있는지 확인하기
				int nextx = x + dx[dir];
				int nexty = y + dy[dir];
				
				//방향바꾸기 조건 : 1.범위를 넘어갈때  , 2. 다음칸이 채워져있을때  
				if(nextx >=N || nexty >=N || nextx < 0 || nexty < 0 || visit[nextx][nexty] == true ) {
					dir = (dir+1)%4;			//방향전환
				}
				
				//다음칸 지정
				x = x + dx[dir];
				y = y + dy[dir];
				
			}
			
			//출력하기
			System.out.println("#" + tc );
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					System.out.print(arr[i][j] + " ");
				}
				System.out.println();
			}
			
			
		}//Tc
		
	}

💡풀이

오른쪽->아래->왼쪽->위 순서로 2차원 배열을 쭉 채워나가면 되는문제였다.
dx,dy 한 쌍의 두배열을 설정하여, 배열인덱스에따라 좌표(x,y) 방향이 바뀔수있도록 의도하였다.

(0,1) -> (1,0) -> (0,-1) -> (-1,0) 순서로 dx,dy의 값이 변해야하는것이다.

이미 방문한 칸은 다시 방문하지않도록 visit라는 2차원 배열에 기록하였고, 다음칸이 배열의 범위를 벗어나거나 이미 방문한 칸이라면 방향을 바꿔주는 로직을 넣어주었다.

profile
금융 IT서비스를 개발 및 운영하고있는 3년차 개발자입니다.

0개의 댓글