알고리즘

[Java] SWEA - 달팽이 숫자

J3SUNG 2023. 2. 8. 22:42
728x90

소용돌이 모양의 숫자를 찍는 문제입니다.

입력받은 N의 크기 +2 만큼의 배열을 미리 작성하고 바깥부분(0, n+1)을 -1로 처리해주었습니다.

int[] dy = {0, 1, 0, -1};
int[] dx = {1, 0, -1, 0};

먼저 오른쪽으로 이동하고 0이 아닌 숫자를 만났을때 위의 배열을 사용해서 회전을 해주었습니다.

if(map[y+dy[d]][x+dx[d]] != 0) { // 0(빈공간)이 아니면
    d = (d + 1) % 4;
}

 

import java.io.IOException;
import java.util.Scanner;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
Scanner sc = new Scanner(System.in);
        int ts = sc.nextInt();
        int t = 0;
        int[] dy = {0, 1, 0, -1};
        int[] dx = {1, 0, -1, 0};
         
        while(t < ts) {
            ++t;
            int n = sc.nextInt();
            int d = 0;
            int[][] map = new int[n+2][n+2];
            for(int i=0; i<map.length; ++i) {
                for(int j=0; j<map.length; ++j) {
                    if(i == 0 || j == 0 || i > n || j > n ) {
                        map[i][j] = -1;
                    } else {
                        map[i][j] = 0;
                    }
                }
            }
            int cnt = 0;
            int cycle = n*n;
            int y = 1;
            int x = 1;
            while(cnt < cycle) {
                ++cnt;
                map[y][x] = cnt;
                if(map[y+dy[d]][x+dx[d]] != 0) { // 0(빈공간)이 아니면
                    d = (d + 1) % 4;
                }
                y += dy[d];
                x += dx[d];
            }
            System.out.printf("#%d%n", t);
            for(int i=1; i<=n; ++i) {
                for(int j=1; j<=n; ++j) {
                    System.out.printf("%d ", map[i][j]);
                }
                System.out.println();
            }
        }
    }
}