Where who wants to meet someone

백준 Swift [20920] 영단어 암기는 괴로워 본문

백준 알고리즘 문제 기록/심화 2

백준 Swift [20920] 영단어 암기는 괴로워

Lust3r 2023. 9. 12. 13:16
728x90

난이도

실버 III

 

문제

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

 

20920번: 영단어 암기는 괴로워

첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단

www.acmicpc.net

 

내 답안

var wordDictionary = [String : Int]()

let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0]
let m = input[1]

for _ in 1...n {
    let word = readLine()!

    if word.count >= m {
        wordDictionary[word, default: 0] += 1
    }
}

let sortWordDictionary = wordDictionary.sorted { first, second in
    if first.value == second.value && first.key.count != second.key.count {
        return first.key.count > second.key.count
    } else if first.value == second.value && first.key.count == second.key.count {
        return first.key < second.key
    } else {
        return first.value > second.value
    }
}

let results = sortWordDictionary.map { $0.key }

results.forEach { result in
    print(result)
}
  • Dictionary를 사용해야 함은 알았지만 조건을 어떻게 줄지 까다로웠던 문제.
  1. 단어를 담을 wordDictionary 빈 Dictionary 생성 
  2. 맨 처음 input값을 n과 m으로 분리
  3. n만큼 for문을 돌면서 word를 받고, 그 word 글자수가 m 이상이면 wordDictionary에 값을 +1 해서 추가
  4. 대망의 Dictionary filter
    4-1. 기존의 sorted는 { $0.value ~ } 이런식으로 사용했는데 여기서는 조건을 다 다뤄야 하므로 first, second 인자를 사용하여 처리
    4-2. 비교하는 두 값의 value가 같은데 글자수가 다르다면(2번 조건) key의 글자수에 따라 정렬
    4-3. 비교하는 두 값의 value가 같고 글자수도 같다면(3번 조건) key를 사전 순으로 정렬
    4-4. 그 외에는(두 값의 value가 다른 경우, 1번 조건) 비교하는 두 값의 value에 따라 정렬
  5. results에 4번의 결과물을 map을 통해 key만 뽑아서 저장
    (4번 결과물은 [(key: String, value: Int)] 형식이므로)
  6. 5번의 results를 forEach로 돌면서 각 항목을 출력