[Swift] 백준, 단어 수학

문제 링크

백준 알고리즘 - 단어 수학

잡담

테스트 케이스는 잘 나오는데, 역시 틀렸네요.. 음.. 쉽지 않아요.. 결국 검색해서 다른 블로그 풀이법을 봤습니다.

알고리즘 실력이 늘려면 그냥 많이 풀어보는 수밖에 없겠죠..? 진짜 풀이보고 이런 생각을 어떻게할까라는 생각밖에 안들었던 것 같아요..

타고 나야하는건가.. 아무튼 풀이 들어가 보시죠

풀이

  1. 해당 위치의 알파벳을 숫자로 변환할 때, 10의 n 제곱으로 변환한다. (n은 자리수라고 보시면 될 것 같아요)
  2. 변환된 값을 딕셔너리에 키 값을 알파벳으로 저장한다.
  3. 똑같은 알파벳이 또 나오면 이전에 저장된 값에 추가적으로 더해준다.
  4. 딕셔너리를 value 값이 큰 순서대로 정렬한다.
  5. 9로 변수 하나를 선언하고, 그 변수를 딕셔너리를 순회를 돌면서 변수 * value 값을 결과값에 더해준다. (이때, 변수 값을 하나씩 빼준다.)

순서를 이렇습니다. 진짜.. 보고 감탄이 나오네요.. 제가 처음에 생각했던 방법은 그냥 자리수 높은거부터 변환해주면서 내려오면 되는거라고 생각해서 그렇게 해줬더니 틀렸다고 나오더라구요?

시간초과라고 생각했는데, 예상했던 결과랑은 달라서 당황했습니다. 그 반례를 풀이법 찾다가 블로그에서 말해줬는데요..

ABC, D, D가 반례라고 하더라구요.. 이렇게 입력했을 경우, D가 C보다 커야한다고 합니다. 와… 진짜 대박이네요

코드

  • 출처 : https://blog.naver.com/PostView.nhn?blogId=gustn3964&logNo=222140497883

import Foundation


let count = Int(readLine()!)!

var strs = [[String]]()
var dict = [String:Int]()

for _ in 0..<count {
    let str = readLine()!.reversed().map{String($0)}
    strs.append(str)
}

for i in 0..<strs.count {
    for j in 0..<strs[i].count {
        let tar = strs[i][j]
        if let _ = dict[tar] {
            dict[tar]! +=  Int(pow(Double(10),Double(j)))
        }else {
            dict[tar] =  Int(pow(Double(10),Double(j)))
        }
    }
}

let sorted = dict.sorted(by: {$0.value > $1.value})
var sum = 0
var multi = 9
sorted.forEach{
    sum += $0.value * multi
    multi -= 1
}
print(sum)
//[출처] 단어수학 - 백준 1339 - swift|작성자 현무