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

[프로그래머스] 2차원 배열

by yelimu 2025. 3. 12.

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

 

프로그래머스

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

programmers.co.kr

정사각형으로 만들기

문제 설명

이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항
  • 1 ≤ arr의 길이 ≤ 100
  • 1 ≤ arr의 원소의 길이 ≤ 100
    • arr의 모든 원소의 길이는 같습니다.
  • 1 ≤ arr의 원소의 원소 ≤ 1,000

입출력 예arrresult
[[572, 22, 37], [287, 726, 384], [85, 137, 292], [487, 13, 876]] [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]]
[[57, 192, 534, 2], [9, 345, 192, 999]] [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 2], [3, 4]] [[1, 2], [3, 4]]

 

[최종 풀이]

function solution(arr) {
    let col = arr.length;
    let row = arr[0].length;
    let diff = Math.abs(col - row)
    
    if (col > row){
        arr = arr.map(inner => [...inner, ..."0".repeat(diff).split("").map(v => +v)]);
    }else if(col < row){
        let addArr = Array(row).fill(0)
        while(col < row){
            arr.push(addArr);
            col ++;
        }
    } 
    return arr;
}

 

 

⚠️주의할 점

push는 배열의 길이를 반환한다.

처음 if 문에 
arr = arr.map(inner => inner.push(4));
이렇게 작성했더니 arr 출력했을때 arr = [4,4,4,4] 가 나오는 이상한 일이 일어났다
왜냐면 arr의 각각의 요소가 inner.push(4)가 반환하는 배열의 길이 4 로 각각 치환되었기 때문이다.
그래서 spread 문으로 요소를 추가해주는 방법으로 수정했다. 

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

 

프로그래머스

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

programmers.co.kr

특별한 이차원 배열 2

문제 설명

n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

  • 0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]

제한사항
  • 1 ≤ arr의 길이 = arr의 원소의 길이 ≤ 100
  • 1 ≤ arr의 원소의 원소 ≤ 1,000
  • 모든 arr의 원소의 길이는 같습니다.

입출력 예arrresult
[[5, 192, 33], [192, 72, 95], [33, 95, 999]] 1
[[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]] 0

[반복문을 사용한 풀이]

function solution(arr) {
    var answer = 0;
    for (let i = 0; i < arr.length; i++){
        for (let j = 0; j < arr.length; j++){
            arr[i][j] === arr[j][i] ? answer ++ : answer;
        }
    }
    
    return answer === arr.length ** 2 ? 1 : 0;
}

 

[every 메서드를 사용한 풀이]

function solution(arr) {
    return arr.every((v,i) => v.every((_,j)=> arr[i][j] === arr[j][i])) ? 1 : 0;
}

 

결국 두번 순회하는건 마찬가지인거같은데

메서드를 사용하는 편이 좀 더 좋아보인다? 왜 좋아보일까? 

 

  • every()는 조건을 만족하지 않는 요소를 만나면 즉시 false를 반환하고 종료
  • 조기 종료 가능 → 성능 최적화

반면에 반복문을 사용하면

 

  • 모든 요소를 끝까지 확인한 후 결과를 반환

따라서 가독성과 성능 측면에서 every 메서드를 사용하는 코드가 좋은 코드라고 할 수 있다. 고 한다. ㅎ