1157번: 단어 공부 - Python

beaver.zip·2022년 2월 24일
0

baekjoon

목록 보기
28/56

https://www.acmicpc.net/problem/1157

문제

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

입력

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

출력

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

풀이 1 (오답: 시간초과)

import sys
input = sys.stdin.readline

word = input().upper()
max = 0

for w in word:
    if word.count(w) > max:
        max = word.count(w)
        w_max = w
    elif w != w_max and word.count(w) == max:
        w_max = '?'
print(w_max)

시간 초과래서 input() 대신 sys.stdin.readline()까지 썼고,
max를 변수명으로 쓴 것이 문제가 된 것 같아 max를 M으로 바꿔서도 시도해봤는데
계속 시간 초과가 나온다. 어떻게 해결해야하지..?

풀이 2 (정답)

word = input().upper()
M = 0

for w in set(word):
    if word.count(w) > M:
        Mw = w
        M = word.count(w)
    elif word.count(w) == M:
        Mw = '?'

print(Mw)

풀이 1이 시간 초과라는 것은, 풀이 1이 너무 과한 풀이라는 채점 머신의 뜻이 아니었을까?
ㄴ 2022.02.25 금 추가: 풀이가 아니라 구현이 미흡했던 것 같다.

풀이 1에 비해 개선한 것은

  1. for문에서 in word 대신 in set(word)를 사용하여 중복을 제거했음.
  2. elif문에서 w != w_max가 없어도 된다는 걸 알고 지움.
  3. 가독성을 위해 변수명을 바꿨음.

논리는 맞았으나 구현이 미흡했다. 아마 1.과 2.에서 시간 초과가 발생한 것 같다.


배운 점

논리에 이상이 없는 것 같으면 구현에 문제가 있는 것이다.
그러니 쓸모없는 식을 사용하지는 않았는지, 반복 범위가 너무 광범위하지 않은지 생각해보자.

profile
mv blog velog.io/@beaver_zip

0개의 댓글