[Algorithm] 1302. 베스트 셀러

유지민·2023년 1월 22일
0

Algorithm

목록 보기
5/67
post-thumbnail

1302. 베스트셀러 (silver IV)

✔️ 문제

1302번 문제 보기

✔️ 문제 분석 및 해결 과정 설계

  • 문제 이해

    • 하루동안 팔린 책 중 가장 많이 팔릭 책의 제목을 적어둠
  • 입력

    • 첫째 줄 : 팔린 책의 개수 N (1 <= N <= 1,000)
    • N개의 줄 : 책의 제목 (50자 이하, 알파벳 소문자)
  • 출력

    • 가장 많이 팔린 책의 제목
    • 여러 개일 경우 : 사전 순으로 가장 앞서는 제목 출력
  • 문제 분석

    • 사용할 자료구조 : 딕셔너리 (key, value)
    • 딕셔너리의 Key : 책 이름
    • 딕셔너리의 Value : 책의 count
    • 동일한 Key값을 가지는 element가 들어올 때 해당 key의 Value++
    • 출력 시 가장 큰 value값을 가지는 key를 출력
    • 가장 많이 팔린 책이 여러 개일 경우 : 사전 순으로 가장 앞서는 제목 출력

"책 이름":팔린 개수로 저장되도록 하기 위해 Dictionary 자료형 사용

✔️ 문제 해결 과정

  1. d = dict() or d = {}로 dictionary 생성
  • bookd에 있을 경우 d[book]의 value += 1, 없을 경우 d[book] = 1로 초기화
d = dict()
for _ in range(int(input())):
    book = input()
    if book in d:
        d[book] += 1
    else:
        d[book] = 1
  1. 가장 많이 팔린 책(후보군 리스트) 선정
  • value 값을 뽑아주는 d.values() 중 max값을 뽑기 위해 max()함수 사용
  • max value를 가진 키 값을 저장하기 위해 candidate리스트 사용
    → max value를 가진 값이 여러개인 경우 사전 순으로 가장 앞 요소를 출력해야 하기 때문
  • key와 value를 쌍으로 보여주는 d.items() 사용을 통해 max value값을 저장하는 m과 딕셔너리의 value인 v값을 비교
    • v == m 조건을 만족한다면 candidate 리스트에 append(k)
m = max(d.values()) # 가장 많이 팔린 책의 리스트
candidate = []
for k, v in d.items():
    if v == m:
        candidate.append(k)
  1. 사전 순 정렬 후 가장 앞 요소 출력
  • sol 1.
candidate.sort()
print(candidate[0])
  • sol 2.
print(sorted(candidate)[0])

▶️ 코드 전문

d = dict()
for _ in range(int(input())):
    book = input()
    if book in d:
        d[book] += 1
    else:
        d[book] = 1

m = max(d.values()) # 가장 많이 팔린 책의 리스트
candidate = []
for k, v in d.items():
    if v == m:
        candidate.append(k)

# candidate.sort()
# print(candidate[0])
print(sorted(candidate)[0])

💡 회고

이 문제는 풀이 방법이 다 떠올랐음에도 틀린 문제이다.
이유는 문제에서 주어진 요구사항을 충분히 체크하지 못했기 때문이다.
본인이 짠 코드는 아래와 같다.

import sys
input = sys.stdin.readline

N = int(input())
dic = {}

for _ in range(N):
    bookName = input()
    if bookName in dic:
        dic[bookName] += 1
    else:
        dic[bookName] = 1

print(max(dic, key=dic.get), end='')

고려하지 못한 부분은 바로 "가장 많이 팔린 책이 여러 개일 경우, 사전 순 가장 앞자리 제목의 책을 출력한다." 조건이다.
문제를 분석해놓은 주석 부분에도 본 내용이 없는 것을 보니 문제를 대충 읽었던 것 같다.

제출했음에도 계속 오류가 발생해 그 원인을 마지막 결과값 print()문의 개행이 처리되는 부분에서 찾고 있었다.
그 과정에서 새로운 점을 찾기도 하였다.
print()문은 원래 기본 값 설정이 출력 후 개행으로 설정되어있다는 점이다. → print(PRINT_CONTENT, end='\n')
따라서 개행없이 출력하고자 할 때는 end 속성의 값을 ''으로 설정해주면 된다. → print(PRINT_CONTENT, end='')

느낀 점이라고 한다면 문제를 반드시 꼼꼼하게 읽자.이다.
어쩌면 로직을 생각하는 것보다 문제에 대한 꼼꼼한 분석이 코딩 테스트에서 제일 중요한 부분이라고 생각된다.
곧 회의가 있어서 마음이 급했나보다 .. 😂

profile
끊임없이 도전하며 사고하는 주니어 Web FE 개발자 유지민입니다.

0개의 댓글