[Lv.0] 정수를 나선형으로 배치하기

01수정·2023년 11월 9일
0

문제


풀이

  • 빈 배열 생성하는 법
// arr[5][3] (빈 배열 생성)
const arr1 = Array.from(Array(5), () => new Array(3)

// arr[5][3] (null로 초기화하여 생성)
const arr2 = Array.from(Array(5), () => Array(3).fill(null))
  1. (n * n) 크기의 2차월 배열 생성

  2. 1의 배열을 패턴대로 순회하며 값 채우기

    2-1. direction (진행방향)
    y 그대로, x++ (0 ~ n-1)
    x 그대로, y++ (0 ~ n-1)
    y 그대로, x-- (n-1 ~ 0)
    x 그대로, y-- (n-1 ~ 0)

    2-2. move (진행정도)
    n=3 일 때
    3 -> 2 -> 2 -> 1
    1 -> 0
    n=4 일 때
    4 -> 3 -> 3 -> 2
    2 -> 1 -> 1 -> 0
    n=5 일 때
    5 -> 4 -> 4 -> 3
    3 -> 2 -> 2 -> 1
    1 -> 0
    n=6 일 때
    6 -> 5 -> 5 -> 4
    4 -> 3 -> 3 -> 2
    2 -> 1 -> 1 -> 0

function solution (n) {
    const base = Array.from(Array(n), () => Array(n).fill(null));
    
    let x = 0, y = 0;   // 2차원 배열의 행, 열
    let move = n-1;     // 한 번에 값을 채워넣을 횟수 
    let num = 1;        // 2차원 배열에 채워 넣을 값 (1~n)
    
    while (num <= n*n) {
        // n 이 홀수인 경우, 중앙의 한 값을 채운다 (n=5 일 때 [2,2])
        if(x === (n-1)/2 && y === (n-1)/2) {
            base[x][y] = num++
        }
        
        for (let i=0; i<move; i++) {
            base[x][y] = num++
            y++;
        }
        for (let i=0; i<move; i++) {
            base[x][y] = num++
            x++;
        }
        for (let i=0; i<move; i++) {
            base[x][y] = num++
            y--;
        }
        for (let i=0; i<move; i++) {
            base[x][y] = num++
            x--;
        }
        
        move -= 2;
        x++
        y++
    }
    
    return base;
}
profile
새싹 FE 개발자

0개의 댓글