숫자 N이 주어질 때, N * N 배열을 돌아가면서 1 ~ (N*N)까지 숫자를 입력하기
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
for(int test_case = 1; test_case <= T; test_case++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int nowNum = 1;
int[][] arr = new int[N][N];
int cx = 0; // 시작 x 위치
int cy = -1; // 시작 y 위치
int rotateNow = 0; // 이동 방향
while (true) {
if (nowNum > N * N) {
break;
}
if (cx + dx[rotateNow] < 0 || cx + dx[rotateNow] >= N ||
cy + dy[rotateNow] < 0 || cy + dy[rotateNow] >= N ||
arr[cx + dx[rotateNow]][cy + dy[rotateNow]] != 0) {
rotateNow = (rotateNow + 1) % 4;
}
cx = cx + dx[rotateNow];
cy = cy + dy[rotateNow];
arr[cx][cy] = nowNum;
nowNum++;
}
System.out.print("#" + test_case + "\n");
print(arr);
} // [E] test_case
}
private static void print(int[][] arr) {
for (int r = 0; r < arr.length; r++) {
for (int c = 0; c < arr[r].length; c++) {
System.out.print(arr[r][c] + " ");
}
System.out.println();
}
}
}
달팽이 문제의 핵심은 언제 내가 방향을 바꿔서 숫자를 입력할 것인지를 결정하는데 있습니다.
3*3 행렬을 예로 들면,
시작위치에서부터 3까지는 동일한 방향으로 나아가다가 행렬을 벗어나려고 할 때 아래로 꺾이는 모습을 볼 수 있습니다.
5에서 6과, 7에서 8로 넘어가는 부분에서도 마찬가지 현상이 나타납니다.
그리고 행렬을 벗어나는 것 이외에도 8번에서 9번으로 넘어가는 경우처럼, 이미 배열에 숫자가 차 있다면(0이 아닌 숫자가 입력되어 있다면) 방향을 바꿔주어야 합니다.
방향은 시계방향으로 계속 꺾이는 것을 확인 할 수 있으며, 꺾이는 조건과 꺾이는 방향 정보를 적절히 활용하여 문제를 해결할 수 있습니다.
--
[Baekjoon] 백준 1012 유기농배추 (S2^ / BFS) - Java (0) | 2023.02.17 |
---|---|
[Baekjoon] 백준 2667 단지번호붙이기 (S1^ / BFS) - Java (0) | 2023.02.16 |
[SWEA] 7733. 치즈 도둑 (D4 / BFS) - Java (0) | 2023.02.16 |
[Baekjoon] 백준 1952 탑 (G5^ / 스택) - java (0) | 2023.02.14 |
[Baekjoon] 백준 2477 참외밭 (S2^ / 구현) - Java (0) | 2023.02.08 |