백준 1157 파이썬

문제정리:
문자열을 입력받고 문자열 중에서 가장 많이 사용된 알파벳을 출력하는 문제.
가장 많이 사용된 알파벳의 개수가 1개가 아닌 경우에는 물음표를 출력.

ex)
Mississipi
예제 출력 1
?
예제 입력 2
zZa
예제 출력 2
Z
예제 입력 3
z
예제 출력 3
Z
예제 입력 4
baaa
예제 출력 4
A

내가 푼 방법

s = input().upper()
answer = [ 0 for i in range(26) ]

for i in S:
    answer[ord(i)-65] += 1

if(int(answer.count(max(answer)) == 1)):
    print(chr(answer.index(max(answer))+65))
else:
    print("?")
  1. 대문자로 입력 받는다
  2. 알파벳을 카운트할 배열 answer를 만든다. answer의 index는 곧 알파벳이다.
  3. 입력받은 단어를 아스키코드를 이용해 0~26으로 표현하여 answer배열에 알파벳 나온개수 만큼 카운트해준다.
  4. 만약 배열에서 max값을 카운트 했는데 1개이면 index에 65를 더해서 아스키값으로 출력, max값의 카운트가 1이 아니면(가장 많이 사용한 알파벳 개수가 1개가 아니면) ?를 출력하게 해준다.

다른코드 (영지영지 풀이 참고) - 출처 : https://ooyoung.tistory.com/70

words = input().upper()
unique_words = list(set(words))  # 입력받은 문자열에서 중복값을 제거

cnt_list = []
for x in unique_words :
    cnt = words.count(x)
    cnt_list.append(cnt)  # count 숫자를 리스트에 append

if cnt_list.count(max(cnt_list)) > 1 :  # count 숫자 최대값이 중복되면
    print('?')
else :
    max_index = cnt_list.index(max(cnt_list))  # count 숫자 최대값 인덱스(위치)
    print(unique_words[max_index])
  1. 대문자로 입력 받는다
  2. 문자열에서 중복값을 제거 한다. (왜? 라는 의문이 들지만, 다음 코드를 읽어보면 아! 싶음)
  3. 카운트 배열을 만듦 ( 이것도 왜? 라는 의문지 들지만 다음 for문 보면 아! 싶음)
    -여기서 카운트배열의 index는 곧, unique word 리스트의 index와 같다는 걸 인지해야 함.
  4. 중복값을 제거한 단어로 for문을 돌리고, 원래 원래 문자열에서 그 문자를 카운트해서 카운트 배열에 append 함
  5. 카운트 배열의 max값이 1개 이상이면 ? 출력.
  6. 아니면 max값의 인덱스를 찾고, 그 인덱스로 unique_words에 닮긴 단어를 출력

나 처럼 짠 사람은 없는 것 같다.
이건 내가 더 잘 짠 것 같음. 아님 말고.

영지영지님 코드 후기
set을 이용하는 것. 그리고 set의 워드를 for문을 돌며 원래 단어에서 그 단어 출현빈도를 다시 카운트하고 카운트한 걸 다시 카운트 리스트에 담는 작업. 내 머리로는 직관적으로 딱 생각나는 방법은 아니다.

내 코드
알파벳이니까 26개 리스트 하나 냅두고 단어 한방에 쭉 돌면서 빈도 카운트하고, 거기서 max값을 찾고 출력해주는 것. 이게 좀 더 직관적이지 않나 싶다. 물론 아스키를 이용한다는 점에서 가독성은 좀 떨어질 수 있겠네.

좋은 웹페이지 즐겨찾기