양의 정수 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]] |
행/열 | 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 합니다.
const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
const answer = Array.from(Array(n), () => Array(n).fill(0));
let x = 0, y = 0, dir = 0, num = 1;
while(num <= n**2) {
answer[x][y] = num;
let nextX = x + move[dir][0];
let nextY = y + move[dir][1];
if (nextX >= n || nextX < 0 || nextY >= n || nextY <0 || answer[nextX][nextY] !== 0) {
dir = (dir + 1) % 4;
nextX = x + move[dir][0];
nextY = y + move[dir][1];
}
x = nextX;
y = nextY;
num++;
}
return answer;
}
=> 어떻게 해야할지 몰라서 다른사람의 풀이를 보고 어떻게 풀었는지 배웠다.
function solution(n) {
let ans = Array.from({length:n},()=>[]);
let rowMin = 1, rowMax = n-1;
let colMin = 0, colMax = n-1;
let row = col = 0;
let dir = 'r';
for (let i = 1; i <= n*n; i++) {
ans[row][col]=i;
if (dir === 'r') if (col === colMax) colMax--,row++,dir = 'b'; else col++;
else if (dir === 'l') if (col === colMin) colMin++,row--,dir = 't'; else col--;
else if (dir === 'b') if (row === rowMax) rowMax--, col--, dir = 'l'; else row++;
else if (dir === 't') if (row === rowMin) rowMin++, col++, dir = 'r'; else row--;
}
return ans;
}