백준 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("?")
- 대문자로 입력 받는다
- 알파벳을 카운트할 배열 answer를 만든다. answer의 index는 곧 알파벳이다.
- 입력받은 단어를 아스키코드를 이용해 0~26으로 표현하여 answer배열에 알파벳 나온개수 만큼 카운트해준다.
- 만약 배열에서 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])
- 대문자로 입력 받는다
- 문자열에서 중복값을 제거 한다. (왜? 라는 의문이 들지만, 다음 코드를 읽어보면 아! 싶음)
- 카운트 배열을 만듦 ( 이것도 왜? 라는 의문지 들지만 다음 for문 보면 아! 싶음)
-여기서 카운트배열의 index는 곧, unique word 리스트의 index와 같다는 걸 인지해야 함. - 중복값을 제거한 단어로 for문을 돌리고, 원래 원래 문자열에서 그 문자를 카운트해서 카운트 배열에 append 함
- 카운트 배열의 max값이 1개 이상이면 ? 출력.
- 아니면 max값의 인덱스를 찾고, 그 인덱스로 unique_words에 닮긴 단어를 출력
나 처럼 짠 사람은 없는 것 같다.
이건 내가 더 잘 짠 것 같음. 아님 말고.
영지영지님 코드 후기
set을 이용하는 것. 그리고 set의 워드를 for문을 돌며 원래 단어에서 그 단어 출현빈도를 다시 카운트하고 카운트한 걸 다시 카운트 리스트에 담는 작업. 내 머리로는 직관적으로 딱 생각나는 방법은 아니다.
내 코드
알파벳이니까 26개 리스트 하나 냅두고 단어 한방에 쭉 돌면서 빈도 카운트하고, 거기서 max값을 찾고 출력해주는 것. 이게 좀 더 직관적이지 않나 싶다. 물론 아스키를 이용한다는 점에서 가독성은 좀 떨어질 수 있겠네.
Author And Source
이 문제에 관하여(백준 1157 파이썬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@anstjvkdlf/백준-1157-파이썬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)