백준 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를 출력한다.