https://school.programmers.co.kr/learn/courses/30/lessons/181832
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
n | result |
---|---|
4 | [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]] |
5 | [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]] |
입출력 예 #1
예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
행 열 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
1 | 12 | 13 | 14 | 5 |
2 | 11 | 16 | 15 | 6 |
3 | 10 | 9 | 8 | 7 |
따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.
입출력 예 #2
예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
행 열 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
1 | 16 | 17 | 18 | 19 | 6 |
2 | 15 | 24 | 25 | 20 | 7 |
3 | 14 | 23 | 22 | 21 | 8 |
4 | 13 | 12 | 11 | 10 | 9 |
따라서 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]를 return 합니다.
function solution(n) {
let xarr = Array(n).fill(0);
var answer = Array(n).fill(xarr);
let x=0, y=0, direction=0;
let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]
for(let i=1;i<=n*n;i++){
answer[y][x] = i
y+=dy[direction]
x+=dx[direction]
if(x<0 || x>=n || y<0 || y>=n || answer[y][x]){
y-=dy[direction]
x-=dx[direction]
direction = (direction+1) % 4;
y+=dy[direction]
x+=dx[direction]
}
}
return answer;
}
처음에는 x축 배열 하나 만들어서 y축으로 증가하면서 기존에 만들었던 배열 넣으면 되겠지 싶었다. 그래서 그렇게 만든 2차원 배열을 가지고 n*n까지 숫자를 돌리면서 끝에 도달하면 방향 틀게 설정했었다. 그런데 [0][0]에 숫자를 넣으면 [1][0], [2][0], [3][0]에도 값이 들어가는 문제가 발생했다.
function solution(n) {
let answer=Array.from(Array(n), () => Array(n).fill(0))
let x=0, y=0, direction=0;
let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]
for(let i=1;i<=n*n;i++){
answer[y][x] = i
y+=dy[direction]
x+=dx[direction]
if(x<0 || x>=n || y<0 || y>=n || answer[y][x]){
y-=dy[direction]
x-=dx[direction]
direction = (direction+1) % 4;
y+=dy[direction]
x+=dx[direction]
}
}
return answer;
}
js 2차원 배열을 검색하니까 2차원 배열을 저렇게 만들라고 했다. Array.fill할 때 배열을 넣으면 깊은 복사가 되는게 아니라 얕은 복사가 돼서 주소만 넘어갔던 것 같다. 그래서 한 줄에 숫자를 넣으면 나머지 줄에도 반영됐나보다.