[백준] 1157: 단어 공부 - 파이썬[python]

다인·2024년 8월 5일

백준

목록 보기
23/112
post-thumbnail

예전에 자바로 풀었던 풀이 방식과 동일하게 문제를 풀어보았고, 분명 더 좋은 방법이 있을 것 같아서 풀이를 찾아보았다. 파이썬의 내장함수를 제대로 알고 있어야 활용가능한 코드가 있어서 정리해보려고 한당

1. 아스키코드 이용

str = input().upper()
count = [0 for i in range(26)]
max = -1
result = ''

for i in str:
    count[ord(i)-65] += 1

for i in range(26):
    if count[i] > max:
        max = count[i]
        result = chr(i+65)
    elif count[i] == max:
        result = '?'

print(result)
  • 출력할 때 대문자로 해야 하고, 나는 각 알파벳이 나온 횟수를 저장하는 리스트를 만들 것이고 횟수를 저장할 때 아스키 코드를 이용할 것이기 때문에 먼저 입력받은 문자열을 모두 대문자로 만든다.
  • 알파벳이 나온 횟수를 저장하는 리스트를 모두 0으로 초기화해준다.
  • 입력받은 단어에서 하나하나 알파벳을 가져온다. 해당 알파벳을 인덱스로 변환해주기 위해 ord함수를 이용해서 아스키코드 값으로 바꾼 후 65를 빼주었다.
  • 알파벳이 나온 횟수를 모두 저장한 후, 이제 그 리스트를 하나하나 돌며 A~Z까지 알파벳이 몇 번 나왔는지 확인할 것이다.
  • max보다 크면 max를 바꾸어준다. 그리고 출력할 값인 result를 해당 알파벳으로 바꾸어준다. 여기서는 ord()의 반대인 chr()를 이용해서 아스키코드를 알파벳으로 변환해주었다. 그리고 대문자로 출력해야 하기 때문에 65를 더한 것이다.
  • 그런데 max값이 동일하면 ?를 출력해야 하므로 동일한 게 있으면 result를 ?로 바꾸어준다.
  • 결론적으로 for문을 다 돌고 나면 max가 유일하면 해당 알파벳을, 유일하지 않으면 ?를 result에 저장하게 된다.

2. 리스트 내장함수 이용

str = input().upper()
str_list = list(set(str))
count = []

for i in str_list:
  cnt = str.count(i)
  count.append(cnt)

if count.count(max(count)) > 1:
  print("?")

else:
  print(str_list[(count.index(max(count)))])

사실 나는 이 코드를 보자마자 바로 이해하진 못했다.. 아무튼 코드를 분석해보자.

  • 먼저 똑같이 입력받은 단어를 모두 대문자로 바꾸어준다.
  • set()을 이용해서 단어의 중복을 모두 없애주고 리스트로 저장한다.
  • 모든 알파벳의 횟수를 저장하는 것이 아닌, 단어에 등장한 알파벳에 대해서만 횟수를 센다. 그래서 리스트의 크기를 저장하지 않고 선언만 했다.
  • 단어에 등장한 알파벳만 하나하나 받아서, 해당 알파벳이 단어에 몇 번 등장했는지를 count()를 이용해서 세었고 이를 cnt에 저장했다.
  • 이 cnt를 count 리스트에 저장했다.
  • 이제 수를 모두 셌으면 max값을 가지는 알파벳이 두 개 이상인지 확인하고 맞다면 ?를 출력한다. (count라는 리스트 이름, cnt라는 변수, count() 내장함수까지.. 변수명을 단단히 잘못 지었다.)
  • max 값이 유일하다면 해당 max값을 가지는 인덱스를 count리스트에서 찾고, 중복을 제거했던 알파벳 리스트에서 그 인덱스를 이용해서 해당 알파벳을 찾는다. 이것은 str_list와 count 리스트는 일대일 대응되기 때문에 가능한 것이다.

결론

내가 짠 코드가 별로일 건 예상했는데 그냥 아주아주 안 좋네...ㅎ..

0개의 댓글