python/백준 알고리즘

[백준] 1157번 : 단어 공부 (python)

eun2ng 2024. 12. 12. 12:07

문제 링크
https://www.acmicpc.net/problem/1157

 

 

내가 푼 코드

from collections import Counter

word = input()
word_u = word.upper()
count = Counter(word_u).most_common()
if len(count) == 1:
    print(count[0][0])
elif count[0][1] == count[1][1]: 
    print("?")
else:
    print(count[0][0])

1) collections 모듈의 Counter 함수를 import 해준다.

2) word를 입력받고, word_u에  upper() 함수를 통해 word를 다 대문자로 바꿔서 넣어준다.

=> 대소문자를 구분하지 않고, 출력은 대문자로 하기 때문에 이렇게 바꿔주었다.

3) Counter(word_u).most_common(n)을 사용하면 word_u의 요소를 세어서 리스트에 담긴 튜플 형태로 최빈값 n개를 반환해줍니다. 그래서 count를 출력해주면 아래와 같이 나오고 type은 list라는 것을 알 수 있습니다.

4) count[0][0]은 가장 많은 알파벳의 값에 해당됩니다. (count[0][1]은 가장 많은 알파벳의 갯수)

5) 만약 가장 많은 알파벳이 두개 이상이라면 ? 를 출력해줘야 하니까 count[0][1] == count[1][1]이면 ? 를 출력해줍니다.

하지만 문제가 있습니다. 이 두가지만 실행한다면 aa나 bbbb 처럼 한 알파벳으로 이루어진 단어는 count[1][1]이 없어서 오류가 나게 됩니다.그렇기 때문에

6) if count의 길이가 1이면 count[0][0]으로 알파벳을 출력해줍니다.

 

과정

처음에 어떻게 풀어야할지 감이 안 와서 counter. 함수에 대한 구글링,,^^을 통해 힌트를 얻었기 때문에 저 혼자 힘으로 푼 것이 아니다...  그리고 한 알파벳으로 이루어진 단어도 생각해줘야하는 것을 잊고 "왜 안 돼!!!!!!!!!!!!!!" 라고 생각했다.

그리고 count 함수를 잘 모르다보니 함수처리 해준 것들의 type을 알아보며 풀었다...

다른 분들은 어떻게 풀었을까..?

 

남이 푼 코드

word = input().upper()
dict = {}

for i in word:
    if i not in dict:
        dict[i] = 1
    else:
        dict[i] += 1

most_cnt = max(dict.values()) 
n = 0
ans = 0 
for key, value in dict.items():
    if value == most_cnt:
        n += 1
        ans = key

if n>1:
    print('?')
else:
    print(ans)

이 분은 dictionary에다가 [알파벳 : 사용횟수]  형태로 다 입력을 해주셨다.

그리고 최빈값의 사용횟수를 max(dict.values())를 통해 알아주고 key랑 value를 다 for문을 돌려서 찾아주셨다.

 

난 아는 것도 없으면서 너무 얌생이 방법을 찾아서 사용한 거 같다. 다음에 이런 방법으로 또 풀어봐야지.