문제
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ n ≤ 30
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int[][] dist = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int[] pos = {0, 0};
int d = 0;
answer[0][0] = 1;
int i = 2;
while(i <= n*n) {
pos[0] += dist[d % 4][0];
pos[1] += dist[d % 4][1];
if(pos[0] < 0 || pos[0] >= n || pos[1] < 0 || pos[1] >= n || answer[pos[0]][pos[1]] != 0) {
pos[0] += dist[(d+2) % 4][0];
pos[1] += dist[(d+2) % 4][1];
d++;
continue;
}
answer[pos[0]][pos[1]] = i;
i++;
}
return answer;
}
}
이건 솔직히 힌트를 좀 보고 풀었다...
설마 폭탄구현문제를 풀었을 때 방식을 사용할줄은 몰랐다.
계속 "어떻게하면 i 와 j 두개의 인덱스를 계산해서 나선형으로 돌릴까" 만 생각하고 그 틀에서 벗어나지 못했었다.
그래도 힌트 덕분에 해결할 수 있었지만, 힌트를 결국 봤다는게 아쉽기만 하다.
그래도 다음부터는 이런 문제가 나오면 다시 떠올릴 수 있을 것 같다.
방식은 간단하다. pos의 원소는 각각 x와 y라고 두고 해당 원소가 인덱스 범위를 벗어난 값, 즉, 0 또는 n이라면 배열의 끝에 도달했다는 뜻이므로 pos 원소에 값을 더해주는 dist 배열의 원소를 바꿔준다.
그리고 처음 배열을 만들었을 때 0으로 값을 초기화 했으니, 0이 아니라면 이미 방문했다는 뜻이므로 이 조건도 넣어주면 해결할 수 있다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/181832