let a = Character("a").asciiValue!
let word = readLine()!.lowercased().map { Int($0.asciiValue! - a) }
var check = Array(repeating: 0, count: 26)
for char in word {
check[char] += 1
}
let most = check.max()!
if check.filter({ $0 == most }).count > 1 {
print("?")
} else {
let askii = UInt8(check.firstIndex(of: most)!) + a
print(Character(UnicodeScalar(askii)).uppercased())
}
var check: [Character: Int] = [:]
let word = readLine()!.uppercased()
for char in word {
if let value = check[char] {
check[char] = value + 1
} else {
check[char] = 1
}
}
let max = check.values.max()!
let most = check.filter { $0.value == max }
if most.count != 1 {
print("?")
} else {
print(most.first!.key)
}
아스키 코드를 복잡하게 계산할 필요가 없어서 편합니다.
위가 Dictionary를 활용한 방법, 아래가 아스키 코드 + 배열을 사용한 방법입니다. 편리하지만 속도에서는 차이가 난다고 볼 수도 있을 것 같습니다.
var dict: [String: Int] = [:]
// key로 value 조회하기
dict["key"]
// key와 value 모아보기
dict.keys
dict.values
// element 하나의 key와 value 보기
dict.first!.key
dict.first!.value
(updated on 5/30)
위 풀이에서 아스키 코드를 활용한 이유는 단어 안에 중복된 알파벳이 존재할 수 있기 때문입니다. 만약에 존재하지 않게 만들 수 있다면 기존 단어 - (중복 제거된) 알파벳 목록을 활용해서 문제를 풀 수 있습니다.
아래 풀이는 집합을 활용해서 단어의 중복된 알파벳을 제거한 이후에 각 알파벳의 갯수만 세어서 푸는 방법입니다.
// 단어 공부
// 원래 단어
let word = readLine()!.uppercased().map { String($0) }
// 중복을 제외하고 알파벳만 모은 것
let alphabets = Array(Set(word))
// 알파벳만 모은 것과 동일한 길이의 갯수를 저장하는 배열
var result = Array(repeating: 0, count: alphabets.count)
// 모든 알파벳에 대해서 단어 안에 몇개나 있는지 count
for i in 0..<alphabets.count {
result[i] += word.filter({ $0 == alphabets[i] }).count
}
// 최대값을 구한다.
let max = result.max()!
// 최대값이 여러개라면 ? 출력
if result.filter({ $0 == max }).count > 1 {
print("?")
// 최대값이 1개라면 해당 index를 찾아서 알파벳을 출력
} else {
let maxIndex = result.firstIndex(of: max)!
print(alphabets[maxIndex])
}