코딩테스트/99클럽
99클럽 코테 스터디 16일차 TIL - 최소 직사각형
꼽파
2024. 8. 6. 16:49
최소 직사각형
출처 : 프로그래머스 Lv.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 |
풀이
![]() |
![]() |
각 길이에 맞는 사각형을 직접 그려보았다. | 가로 세로 중 더 긴 길이를 가로 길이로 정한다. 가로길이를 겹쳐서 최대 가로길이를 구한다. |
- 일단 모든 지갑이 남는 공간 없이 쏙 들어가도록 만드려면, 해당 지갑의 면적은 가로길이의 최댓값과 세로길이의 최댓값을 곱한 값이어야 한다.
- 이때 무작정 가로길이와 세로길이의 최댓값을 각각 곱하게 된다면 분명히 불필요한 면적이 생기게 된다.
왜냐하면 지갑을 가로 혹은 세로 방향으로 회전할 수 있기 때문이다. - 그래서 두 길이 중 더 긴 값을 가로 길이로 선택하여 필요한 최대 가로 길이를 구한다.
- 이후 남은 세로 길이들 중에서 최댓값을 구하면 된다.
자바스크립트
function solution(sizes) {
// 가로 세로를 비교한다
// 더 큰 값을 가로로 두고, 가로를 기준으로 내림차순 정렬한다
// 세로 길이 중에서 가장 큰 값을 선택한다
const widthArr = []; // 가로 길이
const lengthArr = []; // 세로 길이
for (let i = 0; i < sizes.length; i++) {
let [num1, num2] = sizes[i] // 구조분해 할당
// 둘 중 더 큰 값이 가로 길이 배열로 들어감.
// 더 작은 값은 세로 길이 배열로 들어감.
if (num1 >= num2) {
widthArr.push(num1)
lengthArr.push(num2)
} else {
widthArr.push(num2)
lengthArr.push(num1)
}
}
// 가로 길이 배열의 최댓값과 세로 길이 배열의 최댓값을 곱한 면적
return Math.max(...widthArr) * Math.max(...lengthArr);
}
파이썬
def solution(sizes):
width_arr = [] # 가로 길이 배열
length_arr = [] # 세로 길이 배열
for size in sizes:
num1, num2 = size # 튜플을 언패킹
# 두 값 중에서 큰 값은 가로 길이 배열에, 작은 값은 세로 길이 배열에 추가
if num1 >= num2:
width_arr.append(num1)
length_arr.append(num2)
else:
width_arr.append(num2)
length_arr.append(num1)
# 최대 가로 길이와 최대 세로 길이를 곱하여 지갑의 크기 계산
return max(width_arr) * max(length_arr)
자바스크립트 구조분해 할당
const array = [1, 2, 3];
const [a, b] = array; // a = 1, b = 2
const obj = { x: 10, y: 20 };
const { x, y } = obj; // x = 10, y = 20
파이썬 튜플 언패킹
tuple_example = (1, 2, 3)
a, b = tuple_example # a = 1, b = 2
nested_tuple = (10, (20, 30))
x, (y, z) = nested_tuple # x = 10, y = 20, z = 30
728x90