알고리즘
[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();
}
}
}
}