Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Olive Study Room

[백준 알고리즘] #4673번 : Dictionary, 시간초과, 런타임 오류 본문

cs/알고리즘

[백준 알고리즘] #4673번 : Dictionary, 시간초과, 런타임 오류

Olive Dev 2021. 6. 30. 15:46

 

 

 

문자열 중 가장 많이 나온 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())
}
Comments