본문 바로가기

Problem Solving/Baekjoon Online Judge

<문자열> 1157번 단어 공부 with 파이썬

 

문제

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

입력

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

출력

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

정답비율

38.657%

 

counts = dict()
x = input().upper()
for i in x :
    counts[i] = counts.get(i, 0) + 1
max = max(counts.values())
multi = 0
for i in counts :
    if counts[i] == max :
        multi += 1
        answer = i
if multi > 1 :
    print('?')
else :
    print(answer)

 생각보다 어려운 문제였다. 처음에 딕셔너리로 풀어보겠다고 시도하다가 복잡해져서 리스트로 바꿨다가 다시 딕셔너리로 돌아왔다. 

 

 먼저 문제에서 대소문자를 구분하지 않는다고도 하였고 예제출력도 모두 대문자이므로 입력값을 받을 때 대문자로 바꿔주었다.

 

 첫 번째 for구문으로 딕셔너리의 키와 값은 각각 문자와 그 문자의 갯수로 만들어 주었다.

 

 max에는 값중 가장 큰 값을 담아주었다. 즉 가장 큰 갯수를 변수로 설정하였다. multi 변수는 가장 큰 알파벳이 1개를 초과하는 것을 구분시키기 위해 설정하였다.

 

 두 번째 for구문으로 가장 큰 값이랑 일치하면 multi를 1 추가하게 하였고, 그 때의 키 값을 기억하게 하였다. 즉 가장 큰 값을 갖고 있는 알파벳을 answer에 담았다. 이 때 가장 큰 값을 가진 알파벳이 두 개 이상이면 multi가 2이상이 되며 answer은 의미가 없다.

 

 if else구문을 통해 multi를 통한 분기를 해주고 답을 출력하였다.

 

 

 


 

 

 

참고

 

 

 

1157번: 단어 공부

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

www.acmicpc.net