푸는데 어려움을 겪었다.

 

처음 생각했던 방법은 시간초과가 나올 것 같은 방법이었다.

배열을 만들어 a~z까지 방을 만들고, for문을 통해서 단어를 하나하나 갯수를 배열에 채우는 것이었다.

 

이 방법 말고 다음으로 택했던 방법은 dict를 사용하는 것이었다.

의도는 단어를 이루는 알파벳을 key로 하고, 갯수를 value로 해서 key와 value를 계속 update 시키는 것이었다.

그런데, 문제에 봉착한 부분이 있었는데, 그 부분은 다음의 코드를 통해 알 수 있다.

1
2
3
4
5
6
7
8
9
word = input()
word = word.lower()
dictionary = {}
for i in word:
    if i not in dictionary:
        dictionary = dict(i = 1)
    else:
        dictionary[i] = dictionary[i] + 1
print(max(dictionary))
cs

보면 알 수 있겠지만, 틀린 이유는 dictionary에 코드처럼 'i'를 넣으면, for문의 i에 해당하는 값이 들어가지 않고, 진짜로 'i' 값이 들어간다. 따라서, max를 출력하게 되면 i 혼자 출력하게 된다.

즉, 틀린 코드다.

 

뭔가 방법이 있을 것 같긴 한데... 아직 찾지 못하였다.

혹시 방법을 안다면 댓글에 조언 및 언급을 해주시면 정말로 감사하겠습니다 ....

 


아무튼 dict()로 해결을 하지 못해서 다시 처음부터 다시 시작했다 (사실 결국 인터넷 검색을 했... ㅠ)

그렇게 해서 결국 찾은 방법은 set()와 count()를 사용하는 것이다. 

set()는 중복되는 값을 없애는 것이고, count()는 set에 있는 원소들이 실제로 각각 몇 개씩 있는지 세는 것이다.

이런 함수를 잘 알고 있어야 한다는 사실을 한 번 또 느낀다.

 

따라서 다음과 같은 코드로 간단히 해결이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
word = input().lower()      # word = mississipi / baaa
words = list(set(word)) # set를 통해서 중복 없애기 ==> word_list = ['m', 'i', 's', 'p'] / ['b', 'a']
cnt = []
 
for i in words:         # i = m, i, s, p / b, a
    count = word.count(i)  # count()를 통해서 set의 원소의 갯수를 센다.
    cnt.append(count)       # cnt = [4, 4, 1, 1] / [1, 3]
 
if cnt.count(max(cnt)) >= 2:
    print("?")
else:
    print(words[(cnt.index(max(cnt)))].upper())
cs

 

문제 출처: https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

+ Recent posts