[프로그래머스] 최소직사각형 JS 풀이

강풍윤·2024년 3월 31일
0

프로그래머스

목록 보기
1/10
post-thumbnail

1. 문제설명

문제 설명
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
---------------------------
명함 번호 | 가로 길이 | 세로 길이
---------------------------
  1	    |   60	  |  50
---------------------------
  2	    |   30	  |  70
---------------------------
  3	    |   60	  |  30
---------------------------
  4	    |   80	  |  40
---------------------------
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

제한사항
sizes의 길이는 1 이상 10,000 이하입니다.
sizes의 원소는 [w, h] 형식입니다.
w는 명함의 가로 길이를 나타냅니다.
h는 명함의 세로 길이를 나타냅니다.
w와 h는 1 이상 1,000 이하인 자연수입니다.

입출력 예
-------------------------------------------------------
sizes	                                      | result
-------------------------------------------------------
[[60, 50], [30, 70], [60, 30], [80, 40]]	  |  4000
-------------------------------------------------------
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] |   120
-------------------------------------------------------
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] |	  133
-------------------------------------------------------

입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.

입출력 예 #2
명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.

입출력 예 #3
명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.

2. 나의 풀이

2-1) 문제 정의와 나의 풀이

<문제 정의>

  1. 가로 길이와 세로 길이를 비교하여 큰 값을 가로 길이(w)로, 작은 값을 세로 길이(h)로 배열을 수정한다.
  2. 위의 규칙으로 정리된 명함 사이에서 가로 길이에서 가장 큰 값과 세로 길이에서 가장 큰 값을 찾는다.
  3. 가장 큰 가로 길이와 세로 길이의 곱을 구하고 return 한다.
function solution(sizes) {
  	// sizes 배열을 가로 세로의 길이를 비교하여 두 길이 중 큰 값과 작은 값을 [큰 값, 작은 값] 형태로 수정
    sizes = sizes.map((v)=>{
        if(v[0]<v[1]){
            let temp = v[0];
            v[0] = v[1];
            v[1] = temp;
        }
        return v
    })
    
    // 위의 규칙으로 얻은 가로의 길이 중 가장 큰 값을 w로 설정
    let w = Math.max(...sizes.map((v)=>v[0]))
    // 위의 규칙으로 얻은 세로의 길이 중 가장 큰 값을 h로 설정
    let h = Math.max(...sizes.map((v)=>v[1]))
    
    // 최소 직사각형의 넓이를 return
    return w*h
}

2-2) 나의 풀이 채점결과

3. 다른 사람의 풀이

3-1) 다른 사람의 풀이

function solution(sizes) {
    const rotated = sizes.map(([w, h]) => w < h ? [h, w] : [w, h]);
    let maxSize = [0, 0];
  
    rotated.forEach(([w, h]) => {
        if (w > maxSize[0]) maxSize[0] = w;
        if (h > maxSize[1]) maxSize[1] = h;
    })
  
    return maxSize[0]*maxSize[1];
}

3-2) 다른 사람의 풀이 채점 결과

4. 느낀 점

<나의 풀이와 달랐던 점>

  • temp라는 변수를 이용해 두 변수의 값을 서로 바꾸어 준 것과 다르게 다른 사람의 풀이에선 구조분해할당을 통해 swap하였다.(훨씬 직관적임)
  • 프로그래머스의 댓글을 확인하니, 실무자 입장에선 다른 사람의 풀이가 좋다는 평가가 많았다.
  • 속도와 메모리 공간 측면에서는 나의 풀이가 빨랐다. 왜인지는 한번 알아보아야겠다...
profile
https://github.com/KANGPUNGYUN

0개의 댓글