프로그래머스 0단계 - 정수를 나선형으로 배치하기 본문
0 단계 : 정수를 나선형으로 배치하기
코딩테스트 연습 > 코딩 기초 트레이닝 > 정수를 나선형으로 배치하기
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ n ≤ 30
입출력 예
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
입출력 예 #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
코드
function solution(n) {
const baseRow = Array(n).fill(0);
// [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]
let result = [...Array.from({length : n}, _ =>[...baseRow])];
const direction = [[0, 1], [1, 0], [0, -1], [-1, 0]];
const repeatTime = n * 2 - 1;
let dirIndex;
let loop = n;
const mappingArray = [];
for(let i = 0; i < repeatTime; i++) {
dirIndex = i % 4;
mappingArray.push([loop, dirIndex]);
if(dirIndex % 2 === 0) {
loop--;
}
}
let value = 1, row = 0, col = -1;
for(let i = 0; i < mappingArray.length; i++) {
for(let j = 0; j < mappingArray[i][0]; j++) {
row += direction[mappingArray[i][1]][0];
col += direction[mappingArray[i][1]][1];
result[row][col] = value++;
}
}
return result;
}
리뷰
1. return 할 배열 result를 만들어줍니다.
2. 다음과 같은 순서로 행,열 인덱스를 결정합니다.
3. 첫번째, 오른쪽방향의 열의 증가. 두번째, 밑쪽방향의 행의증가. 세번째, 왼쪽방향의 열의감소. 네번째, 오른쪽 방향의 행의 감소
4. 이걸 나타낸 것이 const direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]; 입니다.
5. n이 4일경우 4번채우고 3번채우고 3번채우고 2번채우고 2번채우고 1번채우고 1번채웁니다. 이것이 loop 입니다.
6. 즉 n * 2 - 1 번 direction을 바꾸면서 배열을 채웁니다.
7. loop이 4일때 direction의 index는 0, 3일때 1, 3일때 2, 2일때 3, 2일때 0 .. .이렇게 반복됩니다.
8. [4,0], [3,1], [3,2], [2,3], [2,0], [1,1], [1,2] 이런식으로요
9. 채우는건 4->3->3->2->2->1->1 이렇게 변화하고 그에맞게 direction의 인덱스가 0,1,2,3,0,1,2 ... 이렇게 변화할 거란 것이죠.
10. 이 loop과 해당하는 direction을 담은 배열이 mappingArray 입니다.
11. 4,3,3,2,2,1이 총 n = 4 일때, 16번이죠? 이 mappingArray를 돌면서 mappingArray[i][0]번 만큼 반복하면서 result를 채워줄게요
12. 포인트라 생각하는 것은 row=0으로 시작하지만 첫번째 채우기 때 col이 변하기 때문에 -1로 값을 셋팅하고 row,col을 direction의 인덱스에 해당하는 증감치로 계산해준 뒤,
13. result에 해당하는 숫자를 채워줘야 한다는 것 입니다.
14. 과정이 마무리 되면 result를 return 해주면 됩니다.
총평 : 기초 트레이닝이 다소 어렵네요.
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181832
'알고리즘 > 0단계' 카테고리의 다른 글
프로그래머스 0단계 - 날짜 비교하기 (0) | 2023.06.04 |
---|---|
프로그래머스 0단계 - 그림확대 (1) | 2023.06.04 |
프로그래머스 0단계 - 겹치는 선분의 길이 (0) | 2023.06.04 |
프로그래머스 0단계 - A 강조하기 (0) | 2023.06.04 |
반복문 이용해서 별찍기 (5) | 2022.08.18 |