(정답률 71.57%)
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
2
3
4
#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
3x3의 배열을 인덱스로 나타내면 다음과 같다
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
시계 방향으로 회전하려면 인덱스는
4가지 과정을 거쳐야한다.
단, 각 꼭짓점에서 방향을 전환해주고 방문한 원소에서 역시 방향을 전환해준다.
import static java.lang.System.lineSeparator;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
class SWEA {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
//(0, 1), (1, 0), (0, -1), (-1, 0)
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
for (int test_case = 1; test_case <= T; test_case++) {
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[][] result = new int[n][n];
int dir = 0;
int r = 0, c = 0;
for (int i = 1; i <= n * n; i++) {
result[x][y] = i;
int nextX = x + dx[direction];
int nextY = y + dy[direction];
//다음 행과 열에 대하여
if (nextX >= n || nextX < 0 //행의 처음과 끝일 때
|| nextY >= n || nextY < 0 //열의 처음과 끝일 때
|| result[nextX][nextY] != 0) //방문한 원소일 때
{
direction = (direction + 1) % 4; //방향 전환
}
x += dx[direction];
y += dy[direction];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(result[i][j]).append(" ");
}
sb.append(lineSeparator());
}
System.out.print("#" + test_case + lineSeparator() + sb);
}
}
}
2차원 배열의 방향을 전환하면서 푸는 문제는 처음이라 낯설고 어려웠다.
D2이고 정답률이 높은데 뭔가 잘못된거 같다..