알고리즘

백준 29723번 문제 풀이

kimhyeji 2025. 4. 18. 03:20

문제 풀이 전략

  1. 과목 이름 → 점수를 매핑하여 Dictionary로 저장
  2. 공개 과목 이름은 Set으로 저장
  3. 공개 과목 점수는 무조건 포함 → 점수 합산
  4. 나머지 과목은 비공개 후보
  5. 이 중에서 M-K개를 선택해 점수를 합산
    • 낮은 점수를 선택 → 최소 점수
    • 높은 점수를 선택 → 최대 점수
  6. 각각 공개 점수에 더해 최종 출력

문제 풀이

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와 정렬 조합은 정확하고 효율적인 조합 방식으로 강력하다.
반응형

'알고리즘' 카테고리의 다른 글

leetcode 349. Intersection of Two Arrays  (0) 2025.04.21
백준 25325번 문제 풀이  (0) 2025.04.21
백준 1181번 문제 풀이  (0) 2025.04.17
백준 25757번 문제 풀이  (0) 2025.04.16
leetcode 187. Repeated DNA Sequences  (0) 2025.04.15