문제 설명
양의 정수 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) {
// n * n 배열을 0으로 채운 상태로 생성
const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
let num = 1; // 채워넣을 숫자
let top = 0, bottom = n - 1, left = 0, right = n - 1; // 경계를 나타내는 변수들
while (top <= bottom && left <= right) {
// 1. 왼쪽에서 오른쪽으로 이동하며 숫자 채우기 (top row)
for (let i = left; i <= right; i++) {
arr[top][i] = num;
num += 1;
}
top++; // top row는 다 채웠으니 위쪽 경계를 한 칸 아래로
// 2. 위에서 아래로 이동하며 숫자 채우기 (right column)
for (let i = top; i <= bottom; i++) {
arr[i][right] = num;
num += 1;
}
right--; // right column은 다 채웠으니 오른쪽 경계를 한 칸 왼쪽으로
// 3. 오른쪽에서 왼쪽으로 이동하며 숫자 채우기 (bottom row)
if (top <= bottom) { // 남은 row가 있는지 확인
for (let i = right; i >= left; i--) {
arr[bottom][i] = num;
num += 1;
}
bottom--; // bottom row는 다 채웠으니 아래쪽 경계를 한 칸 위로
}
// 4. 아래에서 위로 이동하며 숫자 채우기 (left column)
if (left <= right) { // 남은 column이 있는지 확인
for (let i = bottom; i >= top; i--) {
arr[i][left] = num;
num += 1;
}
left++; // left column은 다 채웠으니 왼쪽 경계를 한 칸 오른쪽으로
}
}
// 결과 출력
return arr;
}
'study > Algorithm' 카테고리의 다른 글
[프로그래머스] 주사위 게임 3 (0) | 2024.08.20 |
---|---|
[프로그래머스] 배열 조각하기 (0) | 2024.07.09 |
[프로그래머스] 전국 대회 선발 고사 (0) | 2024.07.04 |
[프로그래머스] 그림 확대 (0) | 2024.07.03 |
[프로그래머스] 옹알이 (1) (1) | 2024.07.02 |