Problem.
Learn.
arr
을 [[]]
와 같이 빈 배열로 선언하는 표현하는 것도 있지만, Array.from
을 쓸 수도 있음
- 복잡해 보이지만, 문제를 잘게 쪼개 단순하게 생각해야 함
- 결국에는 1 ~
n*n
까지 저장되야 함
- 그에 따라
handler
가 자동차 핸들처럼 방향을 핸들링함
col
은 열로, n
과 같으면 방향을 바꿔야 함
- 0보다 작아도 방향을 바꿔야 함
- 나선형이기 때문에 다음 공간에 값이 있으면 방향을 바꿔야 함
row
은 행으로, n
과 같으면 방향을 바꿔야 함
- 0보다 작아도 방향을 바꿔야 함
- 나선형이기 때문에 다음 공간에 값이 있으면 방향을 바꿔야 함
- Level 0 문제여도, 제품을 만드는 것과 구현력에서 차이가 많이 난다는 걸 깨달음
- 단순히 'CRUD를 한다. 캐싱을 적용한다. 동시성 이슈를 해결한다.' 등과 굉장히 다른 기조임
- 앞으로 꾸준히 알고리즘 문제를 풀고, 꼭 복습하는 시간을 가져야 할 듯
Solve.
function solution(n) {
let arr = Array.from( { length: n }, () => Array(n).fill(null) )
const size = n * n
let handler = 'right'
let col = 0
let row = 0
for (let i = 1; i <= size; i = i + 1) {
arr[row][col] = i
if( handler === 'right' ) {
if(col + 1 === n || arr[row][col + 1] !== null) {
handler = 'down'
row = row + 1
} else {
col = col + 1
}
}
else if( handler === 'down' ) {
if(row + 1 === n || arr[row + 1][col] !== null) {
handler = 'left'
col = col - 1
} else {
row = row + 1
}
}
else if( handler === 'left' ) {
if(col - 1 === -1 || arr[row][col - 1] !== null) {
handler = 'up'
row = row - 1
} else {
col = col - 1
}
}
else if( handler === 'up' ) {
if(row - 1 === -1 || arr[row - 1][col] !== null) {
handler = 'right'
col = col + 1
} else {
row = row - 1
}
}
}
return arr
}