해당 문제는 프로그래머스 고득점 kit 완전탐색에 속하는 문제로, 완전 탐색은 딱 이렇게 풀어라 !라는게 사실 없는 것 같아서 그냥 원하는대로 풀었다 ㅎ.ㅎ
완전 탐색 알고리즘은 아직 정리하지 않았다 ... 정리하면 수정하겠음
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 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)입니다.
def solution(sizes):
for size in sizes:
size.sort()
max_i, max_j = 0, 0
for a in sizes:
if max_i < a[0]:
max_i = a[0]
if max_j < a[1]:
max_j = a[1]
return max_i * max_j
Lv1 문제라 그런지 생각보다 빨리 풀렸다 ! (15분 소요)
sizes 리스트 안에 있는 각각의 리스트안의 두 개의 원소를 비교해 정렬해주고, for문을 돌려가면서 sizes 리스트 중에서 큰 값이 가장 큰 값, 작은 값이 가장 큰 값 두 max값을 구해 곱해주었음 !
sort(정렬은 시간복잡도가 매우 높음 ...) 대신에 쓸 수 있는 방법이 분명히 많을 것 ^^,,,
예를 들면 if문이라던가 ... append를 해준다던가 ...
지금보니까 굉장히 성능이 별로인 것 같다 ^^ ... O(n^2logn)+O(n^2) 정도 되지 않을까 ..
def solution(sizes):
return max(max(x) for x in sizes) * max(min(x) for x in sizes)
짱 멋진 한줄 풀이
for문으로 x 값에서 각각 min max 값을 찾고, 그 중에서 또 다시 최댓값을 구해 곱했다.
for문이 각각 두 개, 그리고 안에 min max가 있고 밖에도 max 함수로 감싸주었다.
def solution(sizes):
row = 0
col = 0
for a, b in sizes:
if a < b:
a, b = b, a
row = max(row, a)
col = max(col, b)
return row * col
가장 일목요연하게 한 눈에 이해하기 쉬운 코드여서 가져와봤다.
시간복잡도는 ... O(n^2) 정도이려나요 ...? 사실 시간복잡도 구하는 거 .. 잘 모른다 ..