알고리즘/백준

[백준] 1157: 단어 공부 (Python)

김호록님 2023. 11. 5. 22:48

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

 

 

풀이

보자마자 Counter 모듈을 사용하여 알파벳의 각각의 개수를 리스트로 받아서 사용해야겠다는 생각을 했다. 

그런데 처음에 제출한 코드가 틀렸다 .. 

import sys
from collections import Counter
input = sys.stdin.readline

s = input().rstrip().upper()
cnt = Counter(s) 
max = 0
ans = ''
for i in cnt.keys():
    if max == cnt[i]: # 만약 max 개수와 같을 경우
        print('?')
        ans = 'pass'
        break
    elif max < cnt[i]: # max보다 개수가 더 많을 경우
        max = cnt[i]
        ans = i
if ans == 'pass':
    pass
else:
    print(ans)

챗지피티의 도움을 받았다. 첫번째 if문에서 같은 개수의 알파벳을 보면 바로 출력해버리고 for문을 나가버려서 뒤에 더 많은 개수의 알파벳이 있을 경우를 걸러내지 못하기 때문이었다.

 

정답 코드

import sys
from collections import Counter
input = sys.stdin.readline

s = input().rstrip().upper() # 대소문자 구분하지 않으므로 대문자로 바꿈
cnt = Counter(s) # 카운터 사용하여 딕셔너리 형태로 각 글자 수 받음
max_count = max(cnt.values()) # 가장 많이 나온 알파벳의 개수
max_count_letters = [letter for letter, count in cnt.items() if count == max_count] # 가장 많이 나온 알파벳의 개수와 같을 때만 알파벳을 리스트에 저장

if len(max_count_letters) == 1: # 최대 개수 알파벳이 하나면
    print(max_count_letters[0])
else: # 여러개면
    print('?')

 

알게 된 점

  • 딕셔너리에서 value만 사용하는 방법
  • 딕셔너리 for문 사용 시 key와 value 값을 모두 사용하고 싶을 때 dict.items()를 사용