마음만 바쁜 사람
Published 2022. 4. 22. 18:47
1302-베스트셀러 ALGORITHM/BOJ

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

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

여러 책 이름들을 입력받는데 이 중 가장 많이 중복된 책의 이름을 출력하면 되는 문제이다.

중복되는 요소의 count -> C++에서는 map, 파이썬에서는 dictionary를 이용하면 된다. 

 

여기서 한 가지 더 생각해야 하는 것은 count가 같은 책 이름들이 있을 때, 사전순으로 나열해 가장 앞에 오는 순서의 책 이름을 출력해 주어야 하는 것인데, 결국 map, 또는 dic을 써서 카운트 하고 카운트가 가장 높은 요소들에 대한 배열을 대상으로 문자열의 오름차순 정렬까지 처리해 주어야 하는 문제다.

 

import sys
dic = {}
for _ in range(int(input())):
    bookName = input()
    if bookName in dic:
        dic[bookName] += 1
    else:
        dic[bookName] = 1
sorted_dic = sorted(dic.items(), key = lambda x: x[1], reverse=True)
count =sorted_dic[0][1] 
ans = []
for i in sorted_dic:
    if i[1] == count:
        ans.append(i[0])
ans.sort()
print(ans[0])

 

먼저 딕셔너리를 key(이름): value(나온순서)의 형태로 만들어 value의 기준으로 내림차순 정렬을 하고, 그 후에 가장 앞에 오는 값의 value와 같은 값을 가지는 요소들을 따로 뽑아내어 다시 key를 기준으로 사전식 오름차순 정렬을 해주었다.

 

문제를 푸는 과정에서 딕셔너리의 정렬에 대해 다시 알아볼 수 있어서 무의미한 시간은 아니었지만 이 문제에서는 굳이 딕셔너리의 정렬을 할 필요는 없었다. 어짜피 마지막에 value가 같은 값들을 따로 뽑아내서 사전순 정렬을 하기 때문이다.

바뀐 코드는 다음과 같다.

import sys
dic = dict()
for _ in range(int(input())):
    bookname = input()
    if bookname in dic:
        dic[bookname] += 1
    else:
        dic[bookname] = 1
m = max(dic.values())   # 딕셔너리의 value 중 최댓값
ansList = []

for i in dic:
    if dic[i] == m:
        ansList.append(i)
        
print(sorted(ansList)[0])

'ALGORITHM > BOJ' 카테고리의 다른 글

16946-벽 부수고 이동하기 4  (0) 2022.04.26
2178-미로탐색  (0) 2022.04.26
1058-친구  (0) 2022.04.25
11724-연결 요소의 개수  (0) 2022.04.25
11286- 절댓값 힙  (0) 2022.04.22
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!