최소직사각형(level1)

원용현·2022년 8월 18일
0

프로그래머스

목록 보기
2/49

링크

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

문제

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

예제로 이해


명함의 사이즈가 위의 사진처럼 주어졌다고 할 때, 기본적으로 모든 명함이 들어갈 수 있는 가장 작은 지갑의 사이즈는 가로의 최대 길이와 세로의 최대 길이를 곱한 사이즈가 들어갈 수 있을 것이다.
최소 지갑의 사이즈 = 가로의 최대길이 x 세로의 최대길이 = 80 x 70 = 5600

하지만 여기서 2번 명함의 경우 방향을 돌려서 넣게 된다면 전체 최소 지갑의 사이즈는 더 작아질 수 있다.
최소 지갑의 사이즈 = 가로의 최대길이 x 세로의 최대길이 = 80 x 50 = 4000 ( 2번 명함을 옆으로 돌려 넣었을 경우)

따라서 코드에서 가로와 세로를 비교해서 큰 숫자와 작은 숫자에 대한 정렬에 대한 로직이 필요하다.

정렬된 값을 가지고 가로에 대해 가장 큰 값, 세로에 대해 가장 큰 값을 곱해서 return 해주면 문제가 원하는 최소 지갑의 사이즈를 구할 수 있다.

코드

function solution(sizes) {
    let min = 0
    let max = 0
    
    sizes.map((el,idx) => {
        let sortArr = el.sort((a,b) => b-a)
        if(idx === 0) {
            max = sortArr[0]
            min = sortArr[1]
        } else {
            max = Math.max(max, sortArr[0])
            min = Math.max(min, sortArr[1])
        }
    })
    
    return min * max
}

코드 풀이

let sortArr = el.sort((a,b) => b-a)

가로 세로 사이즈가 맞지 않는 명함에 대해서 돌려서 넣는 경우를 생각하기 위해서 내림차순 정렬을 진행하여 큰 수가 앞으로 오도록 한다.

if(idx === 0) {
	max = sortArr[0]
	min = sortArr[1]
}

map 함수를 진행할 때 우선 max와 min에 저장된 값이 없기 때문에 첫 번째 작업에 대해서 max와 min에 값을 저장을 시켜준다.

else {
	max = Math.max(max, sortArr[0])
	min = Math.max(min, sortArr[1])
}

첫 번째 반복이 아닐 경우 정렬된 값과 각각의 max, min 값을 비교해서 더 큰 값을 저장할 수 있도록 한다. -> 최소 지갑 사이즈는 명함의 최대 사이즈가 들어가야하므로 Math.max 를 진행한다.

0개의 댓글