Baekjoon 문제 풀기 (1157번 : 단어 공부) Python

1157번 : 단어 공부

1. 문제읽기


count 함수와 아스키코드 활용

예전에 비슷한 문제를 풀었던 경험이 있어서 쉽게 떠올릴 수 있었다.
문자열로 입력값을 받은 다음, 아스키 코드를 이용한 A~Z까지 리스트에서 값을 빼서 count로 비교하는 방식이었다.
그러나 이렇게 하니까, 시간초과로 틀렸다.
방식을 바꿔서 풀긴 풀었지만, 문제를 접근하는 방식은 결국 비슷했다.

2. 제출 코드


백만 가까운 숫자를 for문을 돌리고, 거기에 알파벳 26개를 또 for문을 돌려줘서 처음 코드가 시간초과로 틀린 것 같아서 for문을 조금이라도 줄여보려고 알파벳 26개의 리스트를 쓰는 대신 0 값이 26개인 리스트를 만들어 알파벳 위치에 맞게 값을 넣어주었다.
그리고 max 값이 2개가 넘으면 ? 를 출력하고, 아니면 리스트 인덱스의 위치를 가져와서 chr 함수로 알파벳 문자로 바꿔주었다.

n = input()
N = n.upper()
total = [0]*26

for i in N:
    total[ord(i)-65] += 1

if total.count(max(total)) >= 2:
    print("?")
else:
    print(chr(65 + total.index(max(total))))

3. 공부할 것


다른 코드를 보니 훨씬 시간이 적게 걸리는 좋은 코드가 있었다.
set 함수로 중복을 제거하고, 없는 알파벳 값은 아예 제외시키는 것이다.
중복을 제거해야겠다는 생각은 하지 못했는데, 기발한 방법이었다.

n = input().upper()
set_n = list(set(n))

total = []
for i in set_n:
    total.append(n.count(i))


if total.count(max(total)) >= 2:
    print("?")
else:
    print(set_n[total.index(max(total))])

댓글남기기