[Swift] 백준 1157

이예주·2025년 6월 26일

Today I Learned

목록 보기
11/12

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

첫 번째 풀이: Dictionary 사용

import Foundation

let word = readLine()!
var dict: [Character: Int] = [:]

for char in word.uppercased() {
    dict[char, default: 0] += 1
}

let max = dict.max(by: { $0.value < $1.value })!

if dict.values.filter({ $0 == max.value }).count > 1 {
    print("?")
} else {
    print(max.key)
}

첫 번째 풀이는 Dictionary를 이용했다. 아무래도 알파벳으로 개수가 한정되어 있으니 검색하는 데 편할 거라고 생각했다. 그런데 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다. 라는 조건이 붙으니까 어차피 전부 검색해야 하는 상황 발생.
아~ 그럼 Dictionary가 효율적인 건가? 고민이 생겼다.
제출하니 정답으로 나오긴 하는데 81516KB에 108ms가 찍혔다. 다른 언어랑 비교하면 느린 게 당연한 거지만 메모리 차이가 너무 나길래 Dictionary 말고 다른 걸 써야 하나 고민했다.

두 번째 풀이: 배열 인덱스

import Foundation

let word = readLine()!

var alphabet: [Int] = Array(repeating: 0, count: 26)
    
for char in word.uppercased() {
    alphabet[Int(char.asciiValue!) - 65] += 1
}

let maxCount = alphabet.max()!
let maxIndices = alphabet.enumerated().filter { $0.element == maxCount }

if maxIndices.count > 1 {
    print("?")
} else {
    let char = Character(UnicodeScalar(maxIndices[0].offset + 65)!)
    print(char)
}

고민하다가 대문자 알파벳이면 순서도 고정이니 굳이 Dictionary의 key도 몰라도 되지 않나? 싶어서 배열로 바꿨다. 대신 카운팅할 때 아스키 코드를 사용했다.
이쪽이 코드량은 좀 많아도 더 깔끔하고, 시간도 80ms로 줄었다. 메모리는 똑같았다. (이건 백준에서 Swift 채점할 때 메모리를 많이 쓰는 듯.)
다만 코테 볼 때 asciiValue <- 이런 함수들은 바로 생각이 안 날 것 같아서 걱정된단 말이지.



번외로 당황스러웠던 점... xcode를 너무 오랜만에 써서 몰랐는데 16부터 code completion 완성도가 어마무시해져서 그냥 답안을 베끼는 수준이 될 뻔 했다. 다음부터는 기능 끄고 해야지😌
profile
iOS Developer

0개의 댓글