본문 바로가기
코딩테스트/백준 알고리즘 풀이

[백준 알고리즘/python] 백준 1157번 단어 공부, 파이썬

by Godgil 2020. 3. 19.

백준 알고리즘 1157번 단어 공부, 파이썬

 

이번 문제는 백준 알고리즘의 1157번 단어 공부 문제이다. 역시 파이썬으로 풀어보았다.

 

 

솔직히 이 문제를 처음 읽었을 때는, "어, 뭐지? 좀 쉬운데?"라고 생각 했었다.

 

하지만 나는 "시간 초과"로 코드를 세 번이나 제출했다.

 

일단 언제나 그렇듯 문제 분석부터 했다.

 

#조건 1. 첫째 줄에는 알파벳 대소문자로 이루어진 단어가 주어진다.

#조건 2. 가장 많이 사용된 알파벳이 여러 개일 경우 ?를 출력한다.

#조건 3. 대문자와 소문자는 구분하지 않는다.
#조건 4. 출력값은 대문자이다.

 

이 문제에 대한 내 생각 정리이다.


#생각 1. 대소문자 문자로 이루어진 문자열이 주어지는거니까 .count를 사용한다
#생각 2. 대소문자를 구분하지 않으니까, 이는 문자열을 받음과 동시에 대문자로 통일시켜준다.

 

먼저 제일 처음에 낸 코드이다.

 

시간초과인 코드 1

num = 0
lst = list()
for i in change:
    lst.append(change.count(i))
index = lst.index(max(lst))
count = 0
for i in lst:
    if max(lst) == i:
        count = count + 1
if count <= max(lst):
    print(change[index])
else:
    print('?')

왜 그런지 대충 살펴보니, for문이 불필요하게 많았고, for문 안에서 max()같은 메서드를

사용해서, 시간이 많이 소요된거 같았다.

 

그래서 생각 정리를 다시 해 봤다.

 

#생각 1. 알파벳 개수만큼 리스트를 만들어서, 아스키코드를 통해 인덱스에 접근해서 값을 +1 한다.

#생각 2. max()함수를 통해 가장 많은 알파벳 수를 찾아내고, 이게 2보다 크면 ?를 출력한다.

#생각 3. 만약에 2보다 작다면, num이라는 값의 index에 접근하고 다시 아스키코드를 문자로 변환시킨 값을 출력한다. 

 

위와같이 생각하고 코드 수정을 했다.

 

정답인 코드

 

lst = list(0 for i in range(26))
for i in test:
    lst[ord(i)-65] = lst[ord(i)-65] + 1
num = max(lst)
if lst.count(num) >= 2:
    print('?')
else:
    print(chr(lst.index(num) + 65))

좀 많이 깔끔해 진게 육안으로도 보인다.

 

시간 초과는 문제를 풀면서 처음 나온거 같다.

아무렇게나 작성하면 안되니까, 풀기전에 여유를 갖고 생각하는 시간을 늘려야겠다.

 

문제출처

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

댓글