📝 문제
>모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요. (카드 회전 가능)
첫번째 케이스 예시
- [60 * 50], [30 * 70], [60 * 30], [80 * 40] 크기의 카드가 각각 있다.
- 두 번째 카드인 [30*70]을 회전시켜서 [70 * 30]으로 만든다.
- 현재 상태 : [60 * 50], [70 * 30], [60 * 30], [80 * 40]
- 여기서 가로는 4번째 카드의 가로인 80에게 다 덮이기 때문에 얘만 생각해주면 된다.
- 세로는 첫 번째 카드인 50에게 다 덮이기 때문에 얘만 생각해주면 된다.
- 80 * 50 = 4000 이라는 결과가 나온다.
https://programmers.co.kr/learn/courses/30/lessons/86491
🎨 풀이
💡 첫 번째 시도 = 성공 코드
def solution(sizes):
width = []
height = []
for i in range(len(sizes)):
width.append(max(sizes[i][0],sizes[i][1]))
height.append(min(sizes[i][0],sizes[i][1]))
answer = max(width) * max(height)
return answer
> 핵심 : 카드를 돌릴 수 있다는 것. 카드 가로와 세로 중에서 더 긴 걸 한쪽에 몰고, 더 짧은 걸 한쪽에 몰면 됨.
(약간 몰아주기 느낌으로 가는 거!)
문제 푸는 방법
* 카드 회전이 가능하다. (적절하게 돌릴 수 있음 = 가로 세로를 바꿀 수 있음)
① 카드의 가로 세로 중 더 긴 게 가로가 되게 둠. (돌리면 됨)
② 카드 중 최대 가로길이 * 세로길이 해주면 됨.
1. sizes[i]를 돌면서 더 긴 쪽을 width에, 더 짧은 쪽을 height에 넣어준다.
2. 각 리스트의 max 값을 곱해서 answer에 넣어준다.
3. answer을 리턴하면 끝이다!
끝~
💡 다른 사람 풀이 코드
def solution(sizes):
tmp = 0
for i in range(len(sizes)): # x에 작은 값, y에 큰 값이 오도록 함.
if sizes[i][0] > sizes[i][1]:
tmp = sizes[i][0]
sizes[i][0] = sizes[i][1]
sizes[i][1] = tmp
x = max(t[0] for t in sizes)
y = max(t[1] for t in sizes)
return x * y
> 처음에는 회전이 되니까 큰 걸 한쪽에 몰아줘도 된다는 생각을 못했는데, 이 코드를 보면서 아이디어를 많이 떠올리게 되었다!
⭐ 느낀점
> 다른 사람의 코드를 보고 생각하는 것도 실력 향상에 도움이 되겠구나라는 걸 한 번 더 깨달았다. 물론 내가 머리 열심히 굴려가면서 푸는 게 제일 베스트인 것 같지만! 정말 모르겠으면 다른 사람들의 코드를 보고 공부하는 것도 괜찮은 방법이라는 생각이 든다. 파이팅하자!
'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[DAY 103 - 프로그래머스 / Level 2] k진수에서 소수 개수 구하기 (파이썬) (0) | 2022.07.03 |
---|---|
[프로그래머스 / Level 1] 정수 제곱근 판별 (파이썬) (0) | 2022.05.14 |
[프로그래머스 / Level 1] 나머지가 1이 되는 수 찾기 (파이썬) (0) | 2022.05.12 |
[프로그래머스 / Level 2] 짝지어 제거하기 (파이썬) (0) | 2022.05.11 |
[프로그래머스 / Level 1] 신고 결과 받기 (파이썬) (1) | 2022.05.10 |