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 |