고양이와 코딩
[프로그래머스] 정수를 나선형으로 배치하기 본문
문제를 이해하려고 엄청!! 노력했는데요,,,
2차원 배열은 출력은 [[]] 이런식으로 하면서 말은 정사각형 나선형 어쩌구 이런식으로 표현하는게 너무 괘씸합니다
→ ↓ ← ↑ 이렇게 값이 들어가고 있기 때문에 문제에 나와있듯 행과 열로 나누어서 for문을 돌며 값을 넣어야겠다!
라고 생각했는데 ㅎㅎ 못풀었고 chatgpt한테 물어봤습니다 ... ̨(༎ິ῀̫ ༎ິ ̨ )͞˭̳̳̳˭̳̳̳ˍ̿̿ˍ̿ˌ˳ˏ̇⋅∴༣(내 머리는 레벨 -10정도인듯 ㅎㅎ)
function solution(n) {
const matrix = new Array(n).fill().map(() => new Array(n).fill(0));
//n * n 크기의 0으로 초기화된 배열 생성
let counter = 1; // 값 채우기용 카운터 변수
let startRow = 0;
let endRow = n - 1;
let startCol = 0;
let endCol = n - 1;
while (startRow <= endRow && startCol <= endCol) {
// 위쪽 행 채우기 (→ 방향)
for (let i = startCol; i <= endCol; i++) {
matrix[startRow][i] = counter++;
}
startRow++;
// 오른쪽 열 채우기 (↓ 방향)
for (let i = startRow; i <= endRow; i++) {
matrix[i][endCol] = counter++;
}
endCol--;
// 아래쪽 행 채우기 (← 방향)
for (let i = endCol; i >= startCol; i--) {
matrix[endRow][i] = counter++;
}
endRow--;
// 왼쪽 열 채우기 (↑ 방향)
for (let i = endRow; i >= startRow; i--) {
matrix[i][startCol] = counter++;
}
startCol++;
}
return matrix;
}
코드 그대로 가져왔고 이해한 대로 설명만 덧붙일게요..
먼저
이렇게 값이 채워진다는걸 한번 상기시키고 !!
matrix 변수를 [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] 이렇게 초기화합니다
while문으로 (n이 4라면) 시작 행이 endRow보다 작으면서, 시작 열이 endCol보다 작을때까지 반복합니다.
// 위쪽 행 채우기 (→ 방향)
for (let i = startCol; i <= endCol; i++) {
matrix[startRow][i] = counter++;
}
startRow++;
startRow에 해당하는 행에 속하는 배열(원소)에 counter값을 하나씩 증가하면서 할당해 줍니다.
endCol이 3이니까 0,1,2,3 의 인덱스에 각각 1,2,3,4 가 들어가게 됩니다
그리고나서 startRow++로 행을 하나 증가시킵니다! (다음 행으로 이동)
// 오른쪽 열 채우기 (↓ 방향)
for (let i = startRow; i <= endRow; i++) {
matrix[i][endCol] = counter++;
}
endCol--;
행이 하나 이동했으니 위 코드에서는 5, 6, 7의 값이 할당됩니다.
그리고 8이 있는 자리에서부터 다시 입력해야 하므로 endCol을 하나 감소시킵니다.
// 아래쪽 행 채우기 (← 방향)
for (let i = endCol; i >= startCol; i--) {
matrix[endRow][i] = counter++;
}
endRow--; // 이전 행으로 이동
원래 endCol은 3이었고, 아까 하나 감소시켰으므로 2가 됩니다!
인덱스 2의 자리(8)부터 인덱스를 감소시켜 가면서 값을 할당합니다.
이제 8,9,10이 할당됩니다!
그리고 endRow의 값을 하나 감소시킵니다.
마지막으로
// 왼쪽 열 채우기 (↑ 방향)
for (let i = endRow; i >= startRow; i--) {
matrix[i][startCol] = counter++;
}
startCol++; // 다음 열로 이동
}
현재 endRow는 2가 되어 11,16,15,6이 있는 행으로 이동하게 됩니다. (값은 12,11이 들어갑니다)
맨 처음 루프에서 startRow가 하나 증가되었으므로 startRow는 1입니다.
그래서 이미 값이 할당된 구간을 빼고 12, 11만 들어가게 됩니다 ㅎㅎ!!!
그리고 다시 1번 루프부터 반복...
막상 설명을 보니 별게 아닌것처럼 느껴지네요 ?!! 다시 제대로 복습해서 다음에는 풀 수 있도록 합시다
'javascript' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리(BFS) (0) | 2023.12.26 |
---|---|
[프로그래머스] 12월18일 ~ 12월25일 (0) | 2023.12.18 |
[프로그래머스] 12월11일 ~ 12월17일 (0) | 2023.12.11 |
[프로그래머스] 12월04일 ~ 12월10일 (0) | 2023.12.04 |
[프로그래머스] 알고리즘 12월01일 ~ 12월10일 (0) | 2023.12.01 |