Swift) 백준 1713번 후보 추천하기 - S1

https://www.acmicpc.net/problem/1713

 

1713번: 후보 추천하기

첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대

www.acmicpc.net

Dictionary, Tuple를 이용하여 구현. 제거할 후보를 구하는 로직은 처음에는 우선순위 큐를 이용할까 싶었지만, 정렬을 이용. 처음 풀었을때는 정렬을 사용하지 않고 각 Case 별로 구현했지만 이런식으로 하는게 좀 더 쉬운듯하다. 

import Foundation

let n = Int(readLine()!)!
let recommendNum = Int(readLine()!)!
let recommendArr = readLine()!.split(separator: " ").map{Int($0)!}
// 1번이 추천받은 개수 2번이 추가된 시간
var photo: [Int: (Int, Int)] = [:]

for item in 0..<recommendNum {
    if photo[recommendArr[item]] != nil {
        photo[recommendArr[item]]!.0 += 1
    } else {
        if photo.count < n {
            photo[recommendArr[item]] = (1, item)
        } else {
            let sortedList = photo.sorted { first, second in
                if first.value.0 == second.value.0 {
                    return first.value.1 < second.value.1
                }
                return first.value.0 < second.value.0
            }
            photo[sortedList[0].key] = nil
            photo[recommendArr[item]] = (1, item)
        }
    }
}
var answerArr: [String] = []
for item in photo.sorted(by: { $0.key < $1.key }) {
    answerArr.append("\(item.key)")
}

print(answerArr.joined(separator: " "))