본문 바로가기
백준/자료구조

[백준] #1302 베스트셀러 (python)

by 똥먹는낙타 2022. 5. 25.
728x90
반응형

1302번: 베스트셀러

 

1302번: 베스트셀러

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

www.acmicpc.net

문제

김형택은 탑문고의 직원이다. 김형택은 계산대에서 계산을 하는 직원이다. 김형택은 그날 근무가 끝난 후에, 오늘 판매한 책의 제목을 보면서 가장 많이 팔린 책의 제목을 칠판에 써놓는 일도 같이 하고 있다.

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

입력

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

출력

첫째 줄에 가장 많이 팔린 책의 제목을 출력한다. 만약 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목을 출력한다.

예제 입력 1

5
top
top
top
top
kimtop

예제 출력 1

top

예제 입력 2

8
icecream
peanuts
peanuts
chocolate
candy
chocolate
icecream
apple

예제 출력 2

chocolate

✔️ Code 1 - 내가 처음에 푼 코드

import sys
from collections import defaultdict
input = sys.stdin.readline

books = defaultdict(int)
name_list = []
n = int(input())

for _ in range(n):
    book = input().rstrip()
    books[book] += 1

max_num = max(books.values())

for book in books:
    if books[book] == max_num:
        name_list.append(book)

name_list.sort()
print(name_list[0])

✏️ Comment

defaultdict 을 사용해서 키에 대한 초기 값들을 0으로 초기화 시켜주고 팔린 책의 이름을 입력받을 때마다 값을 더해주었다. 처음에 max 값을 구하는 부분에 있어서 for문을 사용해서 구했었는데, 찾아보니 저렇게 간단하게 max(books.value()) 로 구할 수 있어서.. 외워야 할 것 같다.

나는 저렇게 구한 max 값을 이용해서 다시 for문을 돌려서 해당 max 값을 가지는 key(책 이름)가 나올 때 마다 name_list 라는 list에 key를 넣어주었다.

만약에 같은 max 값을 가지는 책이 있다면 사전순으로 먼저 오는 것을 출력하라고 했으므로 이름 순으로 오름차순 정렬해서 가장 앞의 값을 출력하도록 했다.

✔️ Code 2 - 다른 분의 코드 참고

import sys
from collections import defaultdict
input = sys.stdin.readline

books = defaultdict(int)
n = int(input())

for _ in range(n):
    book = input().rstrip()
    books[book] += 1

books = sorted(books.items())
print(sorted(books, key = lambda x : x[1], reverse = True)[0][0])

✏️ Comment

for문을 굳이 두 번 사용하지 않고 더 간단하게 할 수 있는 방법이 있을 것 같아서 다른 분의 코드를 참고했다. 처음 보는 표현이 있어서 외우려고 가져왔다.

1. items()로 정렬

books = sorted(books.items())
print(books)

#5
#top
#top
#top
#top
#kimtop
#[('kimtop', 1), ('top', 4)]

 

2. keys()로 정렬

books = sorted(books.keys())
print(books)

#5
#top
#top
#top
#top
#kimtop
#['kimtop', 'top']

 

3. values()로 정렬

books = sorted(books.values())
print(books)

#5
#top
#top
#top
#top
#kimtop
#[1, 4]

key랑 value는 알았는데, item이라는 것에 대해선 잘 몰랐다…. item을 쓰면 key-value 짝으로 리스트로 나타낼 수 있는 것 같다… 아주 좋다… 그리고 이 분의 경우 마지막엔 lambda 함수를 써서 value 값이 높은 순으로 정렬하여 출력하였다. 이 방법도 좋은 것 같다.

728x90
반응형

댓글