알고리즘/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[] = {0, 1, 0, -1}; int dy[] = {1, 0, -1, 0}; 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>=N || 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 |