자기계발
백준
1157 · 단어 공부 (2024)

백준 1157번 단어 공부

문제

알파벳 대소문자로 된 단어(길이 1,000,000 이하)가 주어진다. 대소문자를 구분하지 않고 가장 많이 사용된 알파벳을 대문자로 출력하고, 가장 많이 사용된 알파벳이 여러 개면 ?를 출력한다.

풀이

단어의 첫 글자를 잡아 대문자와 소문자의 개수를 합산해 딕셔너리에 저장하고, 그 글자를 대문자·소문자 모두 단어에서 지운다. 이를 반복해 모든 알파벳의 개수를 센 뒤, 최댓값을 가진 키를 리스트에 모아 하나면 그 키를, 여럿이면 ?를 출력한다.

word = input()
# 알파벳 정보를 담을 dictionary
alpha_dict = {}
 
while True:
    # 단어의 가장 첫 음절
    alpha = word[0]
    # 음절 대문자와 소문자 개수 파악
    cnt = word.count(alpha.upper()) + word.count(alpha.lower())
    # 딕셔너리에 삽입
    alpha_dict[alpha.upper()] = cnt
    # 해당 음절 대문자 및 소문자 제거
    word = word.replace(alpha.upper(), '').replace(alpha.lower(), '')
    # 단어 길이가 1 미만일때까지 반복
    if len(word) > 1:
        continue
    else:
        break
 
# 딕셔너리의 값 중 가장 큰 값
max_value = max(alpha_dict.values())
# 최대값을 가진 원소 리스트에 담기
max_keys = [key for key, value in alpha_dict.items() if value == max_value]
 
# 리스트 개수로 파악
if len(max_keys) == 1:
    print(max_keys[0])
else:
    print('?')

이 코드는 반복을 마칠 때 글자가 하나 남으면 그 글자를 세지 않고 빠져나온다. 남은 글자의 개수는 항상 1이므로 최댓값이 2 이상인 입력에서는 결과가 같지만, 모든 알파벳이 한 번씩만 나오는 입력(예: ab)에서는 ?가 나와야 하는데 A를 출력한다.

출처