본문 바로가기
BAEKJOON

백준 Silver4 1302 베스트셀러_파이썬

by brandnewthinker 2023. 4. 17.
반응형

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

 

1302번: 베스트셀러

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

www.acmicpc.net

오늘 하루 동안 팔린 책의 제목이 입력으로 들어왔을 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램

주의 사항: 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목

첫 번째 풀이

import sys
from collections import Counter
input = sys.stdin.readline
N = int(input())
li = []
for i in range(N):
    li.append(input().strip())
li.sort()    
new = Counter(li).most_common()
print(new[0][0])

우선 리스트에 책 제목들을 입력받고, 정렬한 뒤 Counter를 사용하여 개수를 세어준다.
그 다음 most_common을 사용하여 많은 순으로 정렬하여 가장 앞의 데이터를 선택한다.

  • most_common: 데이터의 개수가 많은 순으로 정렬된 배열 리턴
  • 미리 sort하고 Counter().most_common()을 하면 사전순으로 정렬되어 나옴

첫 번째 풀이 후에 생각보다 시간이 많이 걸리는 풀이라는 것을 알았다. 그래서 시간을 줄이기 위해 Counter를 사용하지 않는 풀이도 해보았다.

두 번째 풀이

import sys
input = sys.stdin.readline
N = int(input())
li = []
d = {}
best = []
for _ in range(N):
    li.append(input().rstrip())
for i in list(set(li)): d[i] = li.count(i)
for k in d.keys():
    if d[k] == max(d.values()):
        best.append(k)
best.sort()
print(best[0])

전체를 입력받은 리스트를 set으로 중복을 제거하여 다시 리스트로 만들어 준다.
그 다음 딕셔너리에 키-값을 더하고, value는 중복제거 하기 전 리스트에서 count를 사용하여 개수를 세어 넣어준다.
.keys() 와 .values()를 사용하여 가장 큰 값을 가진 키값들을 새로운 리스트에 입력한다.
그 리스트를 사전순으로 정렬하여 가장 앞의 값을 선택해준다.

반응형

댓글