문제 링크 (opens new window)

# 문제 요약

  1. 재료 안에 신맛과 쓴맛이 함께 포함된다. 맛 계산 시 해당 신맛과 쓴맛은 동시에 활용해야함
  2. 1개 재료를 뽑을지 2개 재료를 뽑을지 순회하며 nC1, nC2를 계산한다.
  3. 뽑힌 재료 인덱스를 기반으로 맛 최종 계산
import Foundation

let N = Int(readLine()!)!
var ingredient: [(Int, Int)] = []
var minValue = Int.max

for _ in 0..<N {
    let input = readLine()!.split(separator: " ").map { Int($0)! }
    ingredient.append((input[0], input[1]))
}

func combination<T>(_ elements: [T], _ k: Int) -> [[T]] {
    var ret: [[T]] = []

    func combi(_ index: Int, _ now: [T]) {
        if now.count == k {
            ret.append(now)
            return
        }

        for i in index..<elements.count {
            combi(i+1, now + [elements[i]])
        }
    }
    combi(0, [])
    return ret
}


var indices: [Int] = []
for i in 0..<N {
    indices.append(i)
}

for i in 1...N {
    for indexSet in combination(indices, i) {
        var sourValue = 1
        var bitterValue = 0
        for index in indexSet {
            sourValue *= ingredient[index].0
            bitterValue += ingredient[index].1
        }
        minValue = min(abs(sourValue - bitterValue), minValue)
    }
}
print(minValue)