본문 바로가기
알고리즘/백준 알고리즘

[Baekjoon] 백준 알고리즘: 1302 - 베스트셀러

by 며루치꽃 2021. 6. 14.

문제

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

 

1302번: 베스트셀러

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

www.acmicpc.net

내가 생각했던 풀이과정

 

1. N의 갯수만큼 책 이름을 입력받으면서 lower( ) 메서드를 통해 소문자로 전부 바꿔준다.

 

2. 해시를 사용하기 위해 book이라는 빈 딕셔너리 구조를 선언한다.

입력을 받으면서

1) 해시의 keys 안에 만약 이전에 해당되는 key가 존재할 경우

해당되는 key의 value에 1을 더해준다.

2) 해시의 keys 안에 만약 이전에 해당되는 key가 존재하지 않을 경우

book 딕셔너리에 key에 해당되는 책 이름, value는 1로 해서 넣어준다

 

3. 이제 가장 많은 책의 권수를 알아내야하기 때문에, value의 max 값을 구합니다.

 

4. 가장 많이 읽은 책의 첫번째 이름만 필요하기 때문에, max 값을 구한 이후에는 items( ) 메서드를 이용하여 max에 해당되는 key(책 이름)을 빈 리스트에 넣어줍니다.

 

5. 빈 리스트를 사전순으로 정렬하고 첫 번째 요소만 출력합니다.

 

나의 풀이

N = int(input())

book = {}
for i in range(N):
    temp = input().lower()
    if temp in book.keys():
        book[temp] += 1
    else:
        book[temp] = 1

max_value = max(book.values())

best = []
for book, number in book.items():
    if number == max_value:
        best.append(book)

print(sorted(best)[0])

다른 사람의 풀이

from collections import Counter

n = int(input())
books = []
for _ in range(n):
    books.append(input())

books.sort()
cnt = Counter(books)

print(cnt.most_common(n=1)[0][0])

counter를 이용하여 각 데이터 마다 빈도를 구하고 

most_common( ) 을 이용하여 데이터의 갯수가 많은 순의 리스트를 구하여 가장 빈도가 높은 문자열을 출력하셨다.

 

새로 알게된 점, 확인해야할 점

my_list  = ['Tick', 'Tock', 'Tock'] # 나의 리스트
new_list = ['Tick', 'Tock', 'Song'] # 추가로 나타난 리스트

# 나의 리스트 원소의 개수를 직접 센다
from collections import defaultdict
counter = defaultdict(int)
for item in my_list:
    counter[item] += 1
print(counter)    

# 추가된 리스트 원소의 개수를 누적하여 직접 센다
for item in new_list:
    counter[item] += 1
print(counter)      

# 값으로 정렬하여 가장 많이 나타난 2개를 출력한다
print(sorted(counter.items(), key=lambda kv: kv[1], reverse=True)[:2])

counter를 이용하여 짧은 문장으로 더 가독성있게 구할 수 있습니다.

또한 counter 인스턴스간 더하기, 빼기, 교집합, 합집합 등의 기능도 추가로 이용할 수 있습니다.

my_list  = ['Tick', 'Tock', 'Tock'] # 나의 리스트
new_list = ['Tick', 'Tock', 'Song'] # 추가로 나타난 리스트

# 나의 리스트를 센다
from collections import Counter
counter = Counter(my_list)
print(counter)

# 추가된 리스트를 누적하여 센다
counter.update(new_list)
print(counter)

# 가장 많이 나타난 2개를 출력한다
print(counter.most_common(n=2))

댓글