정수를 나선형으로 배치하기

도비김·2024년 2월 27일
0

Programmers | lv.0 기초 

목록 보기
121/125
문제 설명

양의 정수 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

    따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.

입출력 예 #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

    따라서 [[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]]를 return 합니다.

solution

function solution(n) {
    const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    const answer = Array.from(new Array(n), () => new Array(n).fill(0))
    let x = 0, y = 0, dir = 0, num = 1;
    while(num <= n * n) {
        answer[x][y] = num;
        let nextX = x + move[dir][0];
        let nextY = y + move[dir][1];
        if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
            dir = (dir + 1) % 4;
            nextX = x + move[dir][0];
            nextY = y + move[dir][1];
        }
        x = nextX;
        y = nextY;
        num ++;
    }
    return answer;
}

function solution(n) {
    let ans = Array.from({length:n},()=>[]);

    let rowMin = 1, rowMax = n-1;
    let colMin = 0, colMax = n-1;
    let row = col = 0;

    let dir = 'r';
    for (let i = 1; i <= n*n; i++) {
        ans[row][col]=i;
        if (dir === 'r') if (col === colMax) colMax--,row++,dir = 'b'; else col++;
        else if (dir === 'l') if (col === colMin) colMin++,row--,dir = 't'; else col--;
        else if (dir === 'b') if (row === rowMax) rowMax--, col--, dir = 'l'; else row++;
        else if (dir === 't') if (row === rowMin) rowMin++, col++, dir = 'r'; else row--;
    }

    return ans;
}

어렵다 ;; 수학공부 많이 해놀걸...

profile
To Infinity, and Beyond!

0개의 댓글