1. 문제

프로그래머스

고득점 Kit


2. 핵심 아이디어

완전탐색 정렬


3. 코드

import Foundation

func solution(_ sizes:[[Int]]) -> Int {
    let sortedSizes = sizes.sorted { lhs, rhs in
        return lhs[0]*lhs[1] > rhs[0]*rhs[1]
    }
    let maxSize = sizes.max { lhs, rhs in
        return lhs.max()! <= rhs.max()!
    }!
    let someMax = maxSize.max()!
    var someSize = 0
    while true {
        var isPossible = true
        for size in sortedSizes {
            if (someSize < size[0] && someSize < size[1] ) {
                isPossible = false
                break
            }
        }
        if isPossible {
            return someMax*someSize
        }
        someSize += 1
    }
    return someSize
}

4. 풀이 과정

문제를 이해하는데 시간을 많이 썼고, 구현 방법이 곧바로 떠오르지 않아서 또 헤맸던 문제이다.

현재 답으로 제출한 코드도 문제를 조금 오해해서 작성한 코드인데, 나는 가로 세로 중 최솟값이 지갑들(sizes) 말고 다른 숫자에서 나올 수도 있을 것이라 생각하고 코드를 작성했다.

이는 틀린 것으로, 최대값 최소값 모두 sizes 안에 있는 지갑의 크기에서 산출된다. (당연한건데 왜 이상하게 생각했을까..!)


5. 다른 사람의 코드

import Foundation

func solution(_ sizes:[[Int]]) -> Int {
    var maxNum = 0
    var minNum = 0

    for size in sizes {
        maxNum = max(maxNum, size.max()!)
        minNum = max(minNum, size.min()!)
    }
    return maxNum * minNum
}

깔끔하게 size 중에서 최대값 최소값을 찾고있다.

살짝 재귀적 느낌의 변수가 특이하다. 👍