관리 메뉴

Unwound Developer

백준 1157번 (python) - 단어 공부 본문

Algorithm

백준 1157번 (python) - 단어 공부

unwind 2023. 10. 12. 22:02
반응형

단어 공부

백준 > 단계별로 풀어보기 > 심화 1

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

풀이

중간에 한 번 틀렸었는데, baaa와 같이 입력했을때 생긴 오류였다.

a가 가장 많이 사용됐을 경우인데, max와 max_index를 처음에 0으로 초기화해서 생긴 오류이다.

a가 실제로 가장 많음에도, for문에서 첫 번째 반복에선 무조건count[max_index] == count[i]를 True로 판단한다.(max_index와 i가 같기에)

word = input()
count = [0] * (ord('z')-ord('a')+1)
max = max_index = 0
isRedundant = False

# 편리한 비교를 위해 모두 대문자로 변환
word = word.upper()

for i in word:
    count[ord(i)-ord('A')] += 1

for i in range(len(count)):
    if(count[max_index] < count[i]):
        isRedundant = False
        max_index = i
    elif(count[max_index] == count[i]):
        if(i != 0):
            isRedundant = True

if(isRedundant):
    print("?")
else:
    print(chr(max_index+ord('A')))

그러나, 이 풀이는 python의 기본 함수들을 잘 사용하지 못한 풀이인 것 같다.

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])

위와 같은 풀이가 가능하다.

set 함수로 문자열에서 중복을 삭제해 중복삭제 문자열을 하나 만든다.

그리고, count함수로 문자열에서 중복제거 문자열의 개수를 각각 센다.

그 후, cnt_list 배열에 문자열에서 중복제거 문자열의 문자 개수를 센 것을 append한다.

cnt_list.count(max(cnt_list))는 카운트 cnt_list 배열의 최대값이 여러개인지 판단한다. 1보다 큰 수가 반환되면 중복이 있는 것.

그 후 cnt_list.index(max(cnt_list))는 cnt_list에는 중복제거 문자열의 개수가 순서대로 들어가있기 때문에, 가장 많이 사용된 알파벳의 중복제거 문자열에서의 index와 같다.

아직은 python의 기본 내장함수들이 오히려 헷갈린다...

반응형