최소직사각형

 

문제 요약

지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 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
}

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: 코딩테스트


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다