최소직사각형
문제 요약
지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
가장 긴 가로 길이와 세로 길이 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀(=>회전시켜서) 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return
하도록 solution
함수를 완성해주세요.
매개 변수
- 모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열
sizes
제한 사항
sizes
의 길이는 1 이상 10,000 이하입니다.sizes
의 원소는[w, h]
형식입니다.w
는 명함의 가로 길이를 나타냅니다.h
는 명함의 세로 길이를 나타냅니다.- w와 h는
1 이상 1,000 이하
인 자연수입니다.
입출력 예 및 설명
- 입출력 예 #2: 명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.
- 입출력 예 #3: 명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.
문제 해결 방법
- 가로, 세로 두 길이를 곱한 값이 요구사항이기 때문에 가로, 세로의 구분은 중요하지 않습니다.
- 가로세로 상관없이 명함들 중에서 두 변 중 사이즈가 가장 큰 부분을 겹쳐 지갑을 만든다고 생각하면 됩니다. 첫 번째 예제에서 가장 큰 사이즈를 가로 축으로 겹친 그림은 아래와 같습니다.
- 아래 그림과 같이 각 명함의 사이즈를 오름차순으로 정렬한 뒤, 왼쪽 열에서 가장 큰 숫자에 오른쪽 열에서 가장 큰 숫자를 곱하면 답이 도출됩니다.
코드
import Foundation func solution(_ sizes:[[Int]]) -> Int { var maxInSmalls: Int = 0 var maxInLarges: Int = 0 for size in sizes { let small = min(size[0], size[1]) let large = max(size[0], size[1]) maxInSmalls = max(small, maxInSmalls) maxInLarges = max(large, maxInLarges) } return maxInSmalls * maxInLarges }
0개의 댓글