음,,, Udemy 강의를 들으면서 푼 문제여서 문제이름은 잘모르겠지만 sprial Matrix로 정했다.
문제)
--- Directions
Write a function that accepts an integer N
and returns a NxN spiral matrix.
--- Examples
matrix(2)
[[1, 2],
[4, 3]]
matrix(3)
[[1, 2, 3],
[8, 9, 4],
[7, 6, 5]]
matrix(4)
[[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]]
이렇게 뱅글뱅글 돌아가는 모양의 2차원 배열을 만드는 것이 목표!
function matrix(n) {
let results = Array.from(Array(n), () => new Array(n));
let counter = 1;
let startColumn = 0,
startRow = 0,
endColumn = n - 1,
endRow = n - 1;
// startColumn <= endColumn && startRow <= endRow
while (counter <= n * n) {
for (let i = startColumn; i <= endColumn; i++) {
results[startRow][i] = counter;
counter++;
}
startRow++;
for (let i = startRow; i <= endRow; i++) {
results[i][endColumn] = counter;
counter++;
}
endColumn--;
for (let i = endColumn; i >= startColumn; i--) {
results[endRow][i] = counter;
counter++;
}
endRow--;
for (let i = endRow; i >= startRow; i--) {
results[i][startColumn] = counter;
counter++;
}
startColumn++;
}
return results;
}
2차원 배열 선언하는 방법
row : a
column: b
let results = Array.from(Array(a), () => new Array(b));
for문을 이용해서 선언할 수 있지만 es6에서는 from
메소드를 이용해 선언이 가능하다.
javascript는 빈 array에 바로바로 넣어줄 수 있기 때문에 빈 array만 선언하고 초기화는 해주지 않았다.
맨 윗줄 채우기 -- for i startColumn
~ endColumn
result[startRow][i]
counter
넣기
counter++
첫줄은 다 채워졌으니 startRow++
endColumn 채우기 -- for i startRow
~ endRow
result[i][endColumn]
counter
넣기
counter++
마지막줄 채웠으니 endColumn--
맨 아래줄 채우기 -- for i endColumn
~ startColumn
result[endRow][i]
counter
넣기
counter++
맨아래줄 채웠으니 endRow--
맨 왼쪽줄 채우기 -- for i endRow
~ startRow
result[i][startColumn]
counter
넣기
counter++
맨왼쪽 채웠으니 startRow++
이것을 startColumn <= endColumn && startRow <= endRow
또는
counter <= n*n 까지 하면된다.
알고리즘 기초 sprial 끝~~
출처 : 강좌 링크