문제 풀이 전략
- 과목 이름 → 점수를 매핑하여 Dictionary로 저장
- 공개 과목 이름은 Set으로 저장
- 공개 과목 점수는 무조건 포함 → 점수 합산
- 나머지 과목은 비공개 후보
- 이 중에서 M-K개를 선택해 점수를 합산
- 낮은 점수를 선택 → 최소 점수
- 높은 점수를 선택 → 최대 점수
- 각각 공개 점수에 더해 최종 출력
문제 풀이
let first = readLine()!.split(separator: " ").map { Int($0)! }
let n = first[0], m = first[1], k = first[2]
var subjects: [String: Int] = [:]
for _ in 0..<n {
let line = readLine()!.split(separator: " ")
let name = String(line[0])
let score = Int(line[1])!
subjects[name] = score
}
var knownSubjects = Set<String>()
for _ in 0..<k {
let name = readLine()!
knownSubjects.insert(name)
}
var knownScore = 0
var unknownScores: [Int] = []
for (name, score) in subjects {
if knownSubjects.contains(name) {
knownScore += score
} else {
unknownScores.append(score)
}
}
let pickCount = m - k
let minPick = unknownScores.sorted().prefix(pickCount).reduce(0, +)
let maxPick = unknownScores.sorted(by: >).prefix(pickCount).reduce(0, +)
let minTotal = knownScore + minPick
let maxTotal = knownScore + maxPick
print("\(minTotal) \(maxTotal)")
🔑 키워드 요약
| Dictionary |
과목 이름으로 점수 빠르게 조회 |
| Set |
공개된 과목 이름 저장 및 판별 |
| sorted().prefix(n) |
낮은 점수부터 M-K개 선택 |
| sorted(by: >).prefix(n) |
높은 점수부터 M-K개 선택 |
| reduce(0, +) |
합계 계산 |
🧠 느낀 점
- 공개 정보 vs 비공개 정보의 구분이 명확해야 했다.
- 단순 조합 문제가 아니라, 점수를 최적으로 조합하는 전략적 문제였다.
- 수학적으로는 고정된 값 + 선택 가능한 최솟값/최댓값을 구성하는 문제였다.
- prefix/suffix와 정렬 조합은 정확하고 효율적인 조합 방식으로 강력하다.