[Baekjoon 1157] 단어 공부 (python)
문제 공유: https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
[문제 설명]
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
[제한사항]
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
[입출력 예]
입력 | 출력 | |
예제1 | Mississipi | ? |
예제2 | zZa | Z |
예제3 | z | Z |
예제4 | baaa | A |
[입출력 예 설명]
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는?를 출력한다.
예제 1 : i가 4번 s가 4번 사용되어 ?가 출력
[풀이 설명]
이번에는 함수식으로 만들어보았다.
def baekjoon():
count={}
lists = list(input().upper())
for i in lists:
try: count[i] +=1
except: count[i] = 1
word_number=0
for key,value in count.items():
if max(count.values()) ==value:
m_word = key
word_number+=1
if word_number == 2:
return print('?')
return print(m_word)
baekjoon()
[변수 소개]
count = 문자들의 개수가 저장되어 있는 딕셔너리
lists = 문자열을 입력받아 한 글자씩 저장되어 있는 리스트
word_number = ?를 출력하기 위해 제일 많은 문자가 중복되는 것을 처리하기 위한 변수
m_word = 가장 많이 사용된 알파벳을 저장
[풀이]
1) 어차피 출력은 대문자로 해야 되기에 모든 문자를 upper()를 이용해 대문자로 바꿔서 한 글자씩 lists에 저장한다.
2) 첫번째 for문으로 딕셔너리를 통해 중복된 문자들의 수를 정리한다.
예제 1) Mississipi 입력
count(딕셔너리) = {'M' : 1, 'I' : 4, 'S' : 4, 'P': 1}
3) 두번째 for문으로 딕셔너리의 값들을 하나씩 돈다.
4) max(count.values())로 제일 많이 사용된 문자의 개수를 구하고 같으면 그 문자를 m_word에 저장한다.
4-1) 그리고 저장되어 있기에 word_number +1을 하여 1개가 저장되었다고 말한다.
5) 만약 많은 문자가 여러개 있으면 word_number는 또 +1을 하여 2가 될 것이다.
그러면 ? 출력하고 종료시킨다.
6) 없으면 제일 많은 문자를 출력시키고 종료시킨다.
코드가 상당히 길어서 풀이를 할 때 어떻게 하면 줄일 수 있을지 많이 고민을 한 것 같다.
최대한 코드를 줄이려고 노력을 하였고, ?를 출력하기 위해 여러 고민을 하며 검색을 열심히 했는데, 방법을 못 찾았다.
결국 변수를 추가해서 더러운 코드가 되어버렸다.
확실히 아직은 부족한 점이 많아 보여 기본기부터 탄탄히 하는 것이 중요하다는 것을 느꼈다.