본문 바로가기
백준

[백준] 1302번 : 베스트셀러 – JAVA [자바]

by Hongwoo 2022. 4. 22.
반응형

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

 

1302번: 베스트셀러

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

www.acmicpc.net

 


  • 문제

 


  • 문제 풀이

백준 1302번 베스트셀러는 실버 4 난이도의 문자열 및 맵을 이용한 자료구조 문제이다. 이 문제에서는 n개의 책 제목들이 주어지고 각 책 제목의 카운트를 세서 카운트가 가장 높은 책의 제목을 출력하면 된다. 그리고 카운트가 가장 많은 책이 여러 개일 경우 사전 순으로 가장 앞서는 책 제목을 출력하면 된다.

 

우선 이 문제는 해시 맵을 이용 해서 풀 것이다. 맵을 선언 하는데 키(Key)는 String형으로 해서 책 제목을 저장할 것이고 값(Value)은 int형으로 해서 count를 셀 것이다. 다음과 같이 맵을 선언 한다.

Map<String, Integer> map = new HashMap<>();

 

그리고 책의 count를 셀 때는 getOrDefault (Object Key, V defaultValue)라는 함수를 이용할 것이다. getOrDefault 함수는 찾는 키가 맵에 있으면 찾는 키의 값을 반환하고 없으면 기본 값을 반환하는 함수이다. 이 함수는 맵을 이용할 때 자주 사용하는 메서드이기 때문에 꼭 알아두는 것이 좋다. 

 

getOrDefault (Object Key, V defaultValue)

이 함수에는 2개의 매개변수가 있다. 우선 Object Key는 값을 가지고 와야 하는 요소의 키다. 즉, 이 문제에서는 사람의 이름이 되겠다. 그리고 defaultValue는 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다. 이 함수의 사용법은 밑에 있는 코드를 참고하면 되겠다.

 

따라서 getOrDefault 함수를 이용해서 맵에 넣었으니 맵에는 책 제목마다 카운트가 있을 것이다. 여기서 카운트의 최댓값을 구하고 카운트가 최댓값인 책들을 리스트에 넣는다. 그리고 리스트를 정렬을 해서 맨 앞에 있는 책 제목을 출력만 해주면 끝난다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        Map<String, Integer> map = new HashMap<>();
        int max = 0;
        for (int i = 0; i < n; i++) {
            String book = br.readLine();
            map.put(book, map.getOrDefault(book, 0) + 1);
            max = Math.max(max, map.get(book));
        }
        List<String> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == max) list.add(entry.getKey());
        }
        Collections.sort(list);
        System.out.print(list.get(0));
    }
}

 


  • 후기

맵을 이용 하면 쉽게 풀 수 있는 문제였다.

 

반응형

댓글