알고리즘/SWEA

[SWEA/Java] D2_#1954번 : 달팽이 숫자

happii 2022. 2. 4. 15:24

문제

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

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

[예제]

N이 3일 경우,


N이 4일 경우,
 


[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.


[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

 

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Solution_D2_1954_달팽이숫자 {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int tc = Integer.parseInt(br.readLine());
        // 우, 하, 좌, 상
        int dx[] = {010-1};
        int dy[] = {10-10};
        
        for(int i=0; i<tc; i++) {
            int N = Integer.parseInt(br.readLine());
            
            // N이 1인 경우 따로 처리
            if(N==1) {
                System.out.println("#"+(i+1));
                System.out.println(1);
                continue;
            }
            int[][] snail = new int [N][N];
            
            // 좌표 설정
            int x=0;
            int y=0;
            int dir = 0;    // 처음 방향은 0
            
            for(int j=0; j<N*N; j++) {
                
                snail[x][y] = j+1;
                x += dx[dir];
                y += dy[dir];
                
                // 범위를 벗어나는 경우 방향 전환
                if(x<0 || x>=|| y<0 || y>=N) {
                    
                    // 원래 위치로 돌려줌
                    x -= dx[dir];
                    y -= dy[dir];
                    
                    // 방향 전환 (0->1 우에서 하 / 1->2 하에서 좌 / 2->3 좌에서 상 / 3->0 상에서 우)
                    dir = (dir+1)%4;
                    
                    x += dx[dir];
                    y += dy[dir];
                }
                
                // 이동할 곳에 값이 있는 경우 방향 전환
                if(snail[x][y] != 0) {
                    x -= dx[dir];
                    y -= dy[dir];
                    dir = (dir+1)%4;
                    x += dx[dir];
                    y += dy[dir];
                }
            }//for
            System.out.println("#"+(i+1));
            for(int m=0; m<N; m++) {
                for(int n=0; n<N; n++) {
                    System.out.print(snail[m][n]+" ");
                }
                System.out.println();
            }
            
        }//for
        
    }//main
 
}
 
cs