Olive Study Room
[백준 알고리즘] #4673번 : Dictionary, 시간초과, 런타임 오류 본문
문자열 중 가장 많이 나온 char를 출력해야하는 문제! + 나온 수가 같은 경우 ?를 출력한다.
처음에 문자열을 나눠 배열로 만들기는 했으나 각 char가 등장한 횟수를 카운트해야한다.
처음엔 전역 var count: Int로 셌으나 코드가 너무 복잡해지고
1. 같은 char가 있는지
2. count중 가장 큰 수
3. 2의 인덱스를 맞아와 char출력
이렇게 계속 반복해야하는 횟수가 많아져 시간초과가 났다.
count와 char를 한번에 처리하기 위해 Dictionary를 만들어보기로 했다. ([String : Int])
dictionary 는 key로 처리하기 때문에 dic을 계속 만들지 않고 이미 key가 있는지 확인하여 count를 올릴 수 있다.
Dictionary를 사용한지 꽤 오래돼서 사용방법을 다시 살펴보았다.
아래와같이 선언하고 값을 생성할 수 있다.
- Dic에 append나 insert와 같은 메서드는 사용하지 않고 바로 키값에 따른 value값을 할당해준다.
- Dic은 sort가 되지 않는다. 출력할 때마다 순서가 다르기 때문에 필요하면 sort(by: ) 해줘야 한다. (set처럼)
var dic: [String : Int] = [:]
dic["peng"] = 0
dic["dev"] = 1
// 이미 특정 key가 있는지 확안하기
if dic["peng"] == nil {
dic["peng"] = 1
}
else {
dic["peng"] += 1
}
두 가지에서 잠깐 헤맸는데,
1. 키값이 이미 있는지 확인하기
2. 가장 큰 value의 key 출력하기
Dic에 있는 메소드로 이 두 가지를 은근 쉽게 해결할 수 있었다.
1. dic[key] == nil
2. for key in keys로 dic[key] == dic.values.max()
결론 코드!
let line = String(readLine()!).lowercased().map({String($0)})
var dic: [String: Int] = [:]
var arr: [String] = []
for i in 0..<line.count {
if dic[line[i]] == nil {
dic[line[i]] = 1
}
else {
dic[line[i]]! += 1
}
}
// 아래는 처음 사용했던 코드. max를 쓰지 않으려면 sort해줘야한다.
// let sortedDic = dic.sorted{ $0.1 > $1.1}
// = let sortedDic = dic.value.sorted(by: >)
for key in dic.keys {
if dic[key] == dic.values.max() {
arr.append(key)
}
}
if arr.count > 1 {
print("?")
}
else {
print(Character(arr[0]).uppercased())
}
'cs > 알고리즘' 카테고리의 다른 글
[백준 알고리즘] #10757번 : 수학, arithmetic overflow, 시간초과 (0) | 2022.09.06 |
---|---|
[백준 알고리즘] #2775번 : 수학, 런타임 오류 (0) | 2022.04.07 |
[백준 알고리즘] 7. 문자열 (0) | 2021.06.27 |
[백준 알고리즘] 6. 함수 (0) | 2021.06.26 |
[백준 알고리즘] #4673번 : 셀프넘버, set.remove (0) | 2021.06.25 |
Comments