본문 바로가기
개발 공부 일지/JavaScript

[프로그래머스] 특별한 이차원 배열 1

by yelimu 2025. 3. 10.

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명

정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.

  • arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.
제한사항
  • 1 ≤ n ≤ 100
입출력 예nresult
3 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
6 [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]
1 [[1]]

[오답 풀이]

function solution(n) {
    let newArray = Array(n).fill(Array(n).fill(0))
    for (let i = 0; i < n ; i ++){
        newArray[i][i] = 1;
    }
    return newArray;
}

 

실행 결과
[[1,1,1],[1,1,1],[1,1,1]]

 

 

 

let newArray = Array(n).fill(something) 했을때 fill 메서드를 수행하는 something에 대해 얕은 복사를 해서 각 요소가 채워지기 때문에 

=> something 의 요소를 수정하면 모든 newArray의 요소가 함께 수정되는 문제가 발생한다.

 

 

[최종 풀이]

function solution(n) {
    let newArray = Array(n).fill().map(v=> Array(n).fill(0));
    for (let i = 0; i < n ; i ++){
        newArray[i][i] = 1;
    }
    return newArray;
}

newArray 배열의 요소 각각을 순회하면서 새로운 Array 를 생성해주면 개별 메모리를 차지하게 된다. 


지피티가 추천한 코드는 Array.from을 사용하는 것이다. 

근데 개인적으로 이 문법이 익숙하지가 않다 ㅜ

첫번째 인자로 length 속성을 갖는 객체, 두번째 인자로 각 요소에 수행할 콜백함수 전달하기 

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