본문 바로가기
카테고리 없음

[프로그래머스] 2차원 배열 - 정수를 나선형으로 배치하기

by yelimu 2025. 3. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항
  • 1 ≤ n ≤ 30

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

ㅜㅡㅜ 이 문제는 너무 어렵소.. 

 

[풀이 설명을 엄청 잘해둔 블로그]

 

프로그래머스 정수를 나선형으로 배치하기 JS ( Array(), Array.from(), 중첩for문, n x n 2차원배열만들기

문제 설명 양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요. ✅ 코

hihiha2.tistory.com

row, col 을 인덱스로 하여 for 반복문 중첩으로 위치 이동(인덱스 값을 조정)하면서 값을 추가하는 방법

 

function solution(n) {
    var arr = Array.from({length : n}, () => Array(n).fill(0));
    
    let row = 0;
    let col = 0;
    let num = 1;
    
    for (let i = n ; i > 0 ; i -= 2){ // 한 변의 길이가 2 씩 감소
        for (let j = 0; j < i; j ++){
            arr[row][col] = num ++;
            col ++;
        }
        col --;
        row ++;
        
        for (let j = 0; j < i - 1; j++){
            arr[row][col] = num ++;
            row ++;
        }
        row --;
        col --;
        
        for (let j = 0; j < i - 1; j++) {
          arr[row][col] = num++;
          col--;
        }
        col++;
        row--;

        for (let j = 0; j < i - 2; j++) {
          arr[row][col] = num++;
          row--;
        }
        row++;
        col++;
  }
    
    return arr;
}

코드를 한줄 한줄 따라가보기
고마워 피티야.. 너 참 다정하구나ㅋ


[부트캠프 팀원님의 풀이]

// 배열을 회전하는 함수
function arrayTurn(arr) {
    let n = arr.length;
    let turnArr = Array.from(Array(n), () => Array(n).fill(0));
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            turnArr[n - j - 1][i] = arr[i][j];
        }
    }
    return turnArr;
}

function solution(n) {
// 배열 초기화
    let arr = Array.from(Array(n), () => Array(n).fill(0));
    let num = 1; 
    
    while (num <= n ** 2) {
        for (let i = 0; i < n; i++) {
        // 배열에 0이 포함되어 있을 경우 실행
            if (arr[i].includes(0)) {
                for (let j = 0; j < n; j++) {
                    if (arr[i][j] === 0) {
                        arr[i][j] = num;
                        num++;
                    }
                }
                break;
            }
        }
        arr = arrayTurn(arr);
    }
    // 배열의 [0][0]값이 1일때까지 회전
    while (arr[0][0] !== 1) {
        arr = arrayTurn(arr);
    }
    return arr;
}

arrayTurn : [n - j - 1][i] 위치의 있는 요소를 [i][j] 로 대체하는 함수

turnArr[n - j - 1][i] = arr[i][j] 이 되는 이유

1. while 조건문

num = n ^ 2 이 될 때까지 

 

2. for 반복문 (행 순회)

i = n - 1 까지

 

3. if + for 반복문 (열 순회) 

배열에 0 값이 있다면 &

j = n - 1까지 

 

0인 요소에 num 값을 할당하고, 행이 다 채워지면 break 

arrayTurn 함수를 실행 => 배열 90도 회전

 

배열의 첫 번째 값이 1이 될 때까지 배열을 계속 회전

회전이 끝날 때마다 arr[0][0] 값을 체크해서 1이 될 때까지 회전 => 원래 배열 방향으로 회전

 

 


다들 어떻게 이렇게 쉽게 푸는거냐고.. ! 

마지막 문제를 스스로 풀지못해 슬푼,,