


난이도 : level 1
유형 : 완전 탐색
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/86491
모든 명함들을 수납할 수 있는 지갑 넓이의 최소값을 구해야 한다.
명함 size들을 2차원 배열로 입력 받는다.
[[가로1,세로1],[가로2,세로2],[가로3,세로3],[가로4,세로4]]의 형식이다.
명함은 눕힐 수도 있다는 점을 고려해 지갑넓이의 최소값을 구해야 한다.
예제 2의 경우
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 입력받아 result 120을 반환한다.
어떻게 120이 나왔을까? 역추적하며 로직을 파악해보자
가로, 세로
10, 7
12, 3
8, 15
14, 7
5, 15
15*8 인것 같다.
우선 가로 세로 통합해서 가장 큰 값을 찾는다. => 세로 15
그 값이 가로였다면 세로에서, 세로였다면 가로에서 이 15 미만인 값들 중
나머지 길이를 구해야 하는데,
예제의 경우 세로에서 가장 큰 값 15가 나왔으니 가로에서 그다음 큰 값을 찾아 본다.
14이다. 이때 명함을 눕힐 수도 있다 했으니 이 명함의 14 부분을 눕혀 15로 대체한다면 7로만 만들어도 조건을 만족한다.
-> 현재까지 가로 7
가로에서 그다음 큰 값을 찾는다 => 12
이 명함의 12를 또 15로 하고 세로의 길이를 파악한다 => 3
3은 아까 최대 가로 길이 7보다 작으니 pass
그다음 가로 큰 값을 찾는다 => 10
.
.
.
이 로직으로 흐름을 하다보니 가로세로가 크게 중요하지 않은 것 같다.
그냥 애초에 명험 배열을 싹 크기순으로 정렬해버리면?
[a, b] 의 경우 앞에 a가 무조건 크게 정렬 하면,
가장 큰 a를 한 변으로, 그리고 가장 큰 b를 한 변으로 하면?
이 논리가 맞는지 예제를 통해 파악해본다.
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 이 배열을 앞에 인덱스가 가장 크게 정렬 해본다.
[[10, 7],[12, 3],[15, 8],[14, 7],[15, 5]]
가장 큰 앞 인덱스 15
가장 큰 뒷 인덱스 8
120 이 나온다.
혹시몰라 다른 예제도 눈으로 계산해보니까 적용된다.
# 1. sizes[] 배열안에 배열요소를 더 큰 숫자가 앞에 오게 자리를 세팅한다.
# 2. for in 반복문을 통해 가장 큰 a값, 가장 큰 b값을 찾는다
# 3. a*b 를 return 한다.
def solution(sizes):
a = []
b = []
for arr in sizes:
arr.sort() # 더 작은 숫자가 앞에 오지만 상관없어서 reverse해주지 않았다.
a.append(arr[0]) # 앞에 숫자들을 모은다.
b.append(arr[1]) # 뒤에 숫자들을 모은다.
answer = max(a) * max(b) # 가장 큰 a, b를 곱한것이 답이다.
return answer