https://www.acmicpc.net/problem/1302
- 문제
- 문제 풀이
백준 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));
}
}
- 후기
맵을 이용 하면 쉽게 풀 수 있는 문제였다.
'백준' 카테고리의 다른 글
[백준] 2444번 : 별 찍기 - 7 – JAVA [자바] (0) | 2022.04.23 |
---|---|
[백준] 14607번 : 피자 (Large) – JAVA [자바] (0) | 2022.04.22 |
[백준] 2445번 : 별 찍기 - 8 – JAVA [자바] (0) | 2022.04.22 |
[백준] 13458번 : 시험 감독 – JAVA [자바] (0) | 2022.04.22 |
[백준] 10988번 : 팰린드롬인지 확인하기 – JAVA [자바] (1) | 2022.04.21 |
댓글