(Swift) 백준 1577 단어 공부

SteadySlower·2022년 5월 12일
0

Coding Test

목록 보기
24/305

1157번: 단어 공부

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())
}
  1. 입력 받은 단어를 소문자로 바꾸고 Character a ~ z를 각각 0 ~ 25의 정수로 바꾸어 배열로 저장한다.
  2. check 배열을 만들어서 a ~ z의 갯수를 저장한다.
    1. check[0] = (a의 갯수)
  3. 가장 많이 나온 문자의 갯수를 구하고
    1. 가장 많이 나온 문자의 갯수가 두 개 이상이면 “?”를
    2. 아니라면 해당 문자를 아스키코드를 사용해서 init해서 출력한다.

Dictionary를 사용하는 방법

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를 활용한 방법, 아래가 아스키 코드 + 배열을 사용한 방법입니다. 편리하지만 속도에서는 차이가 난다고 볼 수도 있을 것 같습니다.

💡 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])
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글