본문 바로가기
Programming Knowledge/Algorithm

자바스크립트 js - 최소직사각형[프로그래머스]

by SheenaKaze 2024. 7. 10.

이 문제는 꽤나 저를 힘들게 했던 문제입니다. 알고보면 문제가 어렵다기 보다는 저는 이해하기가 어려웠어요.

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

아래 표는 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

sizes result
[[60,50],[30,70],[60,30],[80,40]] 4000
[[10,7],[12,3],[8,15],[14,7],[5,15]] 120
[[14,4],[12,3],[8,15],[14,7],[5,15]] 133

 

 

# 풀이

function solution(sizes) {
    var rotated = sizes.map(([w,h]) => w < h ? [h:w]:[w:h]);
    return Math.max.apply(null,rotated.map((rotated)=>rotated[0])) * Math.max.apply(null,rotated.map((rotated)=>rotated[1]));
}

1. 문제의 요지 , 핵심 파악
해당 문제의 핵심은 명함 사이즈의 가로 세로 길이를 가진 2차원 배열이 주어졌을 때, 이 모든 명함을 넣을 수 있으면서, 제일 작은 부피를 가진 지갑을 만들어야하는 것입니다.허나 명함 번호 2번처럼 가로 30 , 세로 70의 크기를 가진 경우 
가로 길이의 최대는 80 , 세로 길이는 70이므로 최대 가로길이(80) * 최대 세로길이(70)인 길이가 부피의 지갑입니다. 
하지만 여기서 이 명함을 눕히면 반대로 가로 길이가 70, 세로길이가 30이 되면서 최대 세로길이가 (30)이 되겠죠. 
그러면 부피는 최대 가로 80 * 최대 세로 50 으로써 = 4000(세로 * 가로) 의 부피를 가진 최소 지갑 크기가 됩니다. 
2.var rotated = sizes.map(([w,h])=> w < h ? [h,w]:[w,h]);

그래서 세로가 긴 명함은 눞혀서 가로로 만드는 로직이 필요합니다. 
자바스크립트에는 map 함수가 있습니다. 배열 안에 요소를 조건에 따라 이리저리 조작해서, 새로운 배열을 생성하는 함수입니다.  
1, sizes 라는 배열에 대해 map 함수를 사용하여, 각 요소를 변환합니다. 각 요소[w,h] 에 대해 w < h ? 조건을 통해 h(높이)가 더 크면 h:w 를 반환(세로가 긴 명함을 눕혀서 가로로 만듦) 정상적으로 가로가 더 크면 w:h를 반환합니다. 
2. Math.max 함수는 주어진 숫자 중 가장 큰 수를 반환하는 함수입니다. 이를 사용하면 배열 요소들 중에서 현재 가로로 명함들을 눕혀놨으니, 가로 길이 중 가장 큰 수 , 세로 길이 중 가장 큰 수 를 반환하여 서로 곱셈을 해주면, 이 문제에서 원하는 부피를 반환할 수 있을 것입니다.