본문 바로가기

알고리즘/백준

[백준 / 구현] 1157 : 단어 공부 (python)

728x90

 

문제 설명

문제

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

입력

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

출력

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

 

풀이

word = input().upper()
word_list = list(set(word))
word_cnt = []

for w in word_list:
    cnt = word.count(w)
    word_cnt.append(cnt)
    
if word_cnt.count(max(word_cnt)) > 1:
    print("?")
else:
    print(word_list[word_cnt.index(max(word_cnt))])

 

upper 함수를 이용하여 입력받은 문자열을 전부 대문자로 바꾼다.

word_list 에는 set 으로 저장하여 중복되는 문자를 없앤다.

 

 

for문을 돌면서 문자의 횟수를 word_cnt에 저장한다.

word_cnt는 word_list와 인덱스를 같이하여 해당 word_list의 문자가 나온 횟수를 저장한다. 이때 count 함수를 사용하여 문자 횟수를 센다.

 

word_cnt에 최대 횟수 값이 2개 이상 저장되었다면 ?를 출력한다.

아니라면 최대 횟수(max(word_cnt))의 인덱스를 word_cnt에서 찾고, word_list에서 이 인덱스의 값을 출력한다. (word_cnt와 word_list의 인덱스는 같음)

 

 

 

처음에는 dictionary를 이용하여 {문자 : 횟수} 형태로 저장하고, lambda를 활용하여 횟수를 기준으로 내림차순 정렬하여 2차원 배열에 저장했다.(arr[문자][횟수]) 그리고 가장 앞에 위치한 값이 그 다음으로 오는 값과 같다면 ?를, 아니라면 해당 문자를 출력했다.

그런데 이렇게 푸니까 정답은 나오는데, 시간초과가 나는지 런타임 에러가 나서 위 풀이로 다시 풀었다. 아마 딕셔너리를 정렬된 2차원 배열로 바꾸는 과정에서 시간초과가 나는듯.

 

 

반응형