Level 0 ) 정수를 나선형으로 배치하기 ⭐️

Doozuu·2023년 6월 30일
0

프로그래머스 (JS)

목록 보기
122/183

문제 설명

양의 정수 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. n*n 배열 만들기(0으로 채우기)
  2. 각 동작 반복하기(n > 0 까지)
    왼 -> 오 : x 증가시키기
    위 -> 아래 : y 증가시키기
    오 -> 왼 : x 감소시키기
    아래 -> 위 : y 감소시키기
  3. n-=2 해주어서 내부 채우기

function solution(n) {
    let answer = Array.from({ length: n }, () => Array(n).fill(0));
    let [count, x, y] = [0, -1, 0];
    while(n > 0){
        for(let i=0;i<n;i++){
            x++; 
            count++;
            answer[y][x] = count;
        }
        for(let i=0;i<n-1;i++){
            y++; 
            count++;
            answer[y][x] = count;
        }
        for(let i=0;i<n-1;i++){
            x--; 
            count++; 
            answer[y][x] = count;
        }
        for(let i=0;i<n-2;i++){
            y--; 
            count++;
            answer[y][x] = count;
        }
        n-=2;
    }
    return answer;
}

중간에 발생했던 문제

let answer = Array(n).fill(Array(n).fill(0));

초기 배열을 위와 같이 만들었더니 배열 요소가 다같이 수정되는 문제가 발생했다.

아래처럼 해당 부분만 수정되어야 하는데,
[[1,2,3,4],[0,0,0,0],[0,0,0,0],[0,0,0,0]]  
아래처럼 전부 영향을 받는다.
[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]

이런 일이 발생한 이유는 Array(n).fill(0)을 사용하여 배열을 채우는 것으로 보이지만, 실제로는 동일한 배열 객체를 참조하는 n개의 요소로 채워지기 때문이다.
즉, 배열의 요소들이 모두 동일한 배열 객체를 가리키게 되어 따라서 하나의 요소를 수정하면 모든 요소가 수정되는 결과를 초래한다.


answer 배열의 각 요소가 서로 다른 배열 객체를 참조하도록 수정하기 위해서 Array.from() 메서드를 사용하거나, 반복문을 사용하여 각 요소를 개별적으로 채우는 방법을 선택할 수 있다.

let answer = Array.from({ length: n }, () => Array(n).fill(0));

위와 같이 수정하면 해결된다.

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글