백준

백준 1157번(단어 공부 1)

rabbit-jun 2025. 1. 23. 13:34

문제

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

입력

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

출력

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

나의 풀이

import sys
n=sys.stdin.readline().upper()

a=[]

for i in range(len(n)):
    cnt=0
    for j in range(len(n)):
        k = i +j
        if k <= len(n)-1:
            if n[i] == n[k]:
                cnt +=1

    a.append(cnt)

if a.count(max(a)) ==1:
    print(n[a.index(max(a))])
else: print('?')

맨 처음에는 깊히 생각하지 않았다.
그냥 리스트 하나 넣고 n의 i번째를 n의 다른 요소들과 하나씩 비교해서 같으면 cnt의 수를 늘리고 cnt가 최대가 되는 지점의 값을 인덱스 값으로 하여 뽑아주면 끝!!!!

이라고 생각했지만 시간초과 엔딩...

import sys
n=sys.stdin.readline().upper()
a=[]
b=[]
for l in n:
    a.append(n.count(l))

for i,j in enumerate(n):
    if n.count(j) == max(a):
        b.append(n[i])

if len(set(b)) == 1:
    print(b[0])
else:
    print('?')

그리고 그 다음에는 조금이라도 줄이기 위해서 노력을 했다만...
지금 보니 함수가 더 추가되서 도찐개찐인듯 하다.

발상은 enumerate()에서 인덱스 값을 따로 뽑지 않는 다는 것과 중복되는 값을 set()으로 없앤다. 그 값이 1이면 한 알파벳이 다른 알파벳 보다 큰게 하나라는 거니 그걸 출력해준다.

import sys
n=sys.stdin.readline().upper()
a=[]
for i in n:
    a.append(n.count(i))

if max(a) == a.count(max(a)):
    print(n[a.index(max(a))] )
else:
    print('?')

여기서부터는 조금 더 생각을 깊히 했다.
count()를 활용하는 것은 같으나 쓸데없는 반복문을 줄였다.

import sys
n=sys.stdin.readline().upper()
cnt_n = [n.count(x) for x in n]
max_cnt = max(cnt_n)
if max_cnt == cnt_n.count(max_cnt):
    print(n[cnt_n.index(max_cnt)])
else:
    print('?')

계산식을 일일히 넣으면 시간이 더 걸리는 건가해서 변수에 담고 반복문을 제너레이터로 만들었다.
조건문도 max값 = max값의 개수여야 사용빈도가 같은 알파벳이 없다라는 생각으로 사용했다.

그러나 시간초과!!

반응형