반응형
문제 링크 : https://www.acmicpc.net/problem/1302
1302번: 베스트셀러 (실버4, 자료구조, 문자열, 정렬, 해시를사용한 집합과 맵 JAVA)
해당 문제는 가장 많이 판매된 책을 출력하는 문제입니다. 우선 사용자로부터 입력을 받고 HashMap에 담습니다. key는 책 이름, value는 판매된 횟수로 사용할 예정입니다. maxValue와 maxKey는 마지막 로직에서 가장 많이 판매된 책을 구하기 위한 변수입니다.
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());
String[] book = new String[N];
Map<String, Integer> bookCount = new HashMap<>();
int maxValue = 0;
String maxKey = "";
for(int i=0; i<N; i++) {
book[i] = br.readLine();
bookCount.put(book[i], 0);
}
}
}
이후 아래와 같은 코드를 추가 했는데, 입력받은 book 배열과 같은 책 이름을 가진 HashMap의 key를 찾고 카운트를 증가시킵니다.
for(int i=0; i<N; i++) {
if(bookCount.containsKey(book[i])) {
int getValue = bookCount.get(book[i]);
bookCount.put(book[i], ++getValue);
}
}
Entry를 사용하여 key, value를 꺼내옵니다. 이후 현재 꺼내온 value가 maxValue보다 큰지 확인하고, 해당되는 값들을 저장합니다.
for (Map.Entry<String, Integer> entry : bookCount.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
if(value > maxValue || (value == maxValue && key.compareTo(maxKey) < 0)) {
maxKey = key;
maxValue = value;
}
}
(value == maxValue && key.compareTo(maxKey) < 0) 의 경우 값이 최댓값과 동일하면서, 현재의 키 값이 maxKey보다 사전 순으로 더 앞서는 경우를 뜻합니다.
만약 아래와 같은 입력값이 들어간다면 top과 abc는 모두 판매 횟수가 4지만, abc가 사전적으로 앞에 위치했기 때문에 (value == maxValue && key.compareTo(maxKey) < 0) 에 의해 maxKey는 "abc"로 교체됩니다.
9
top
top
top
top
abc
abc
abc
abc
kimtop
최종적으로 완성된 코드는 아래와 같습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
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());
String[] book = new String[N];
Map<String, Integer> bookCount = new HashMap<>();
int maxValue = 0;
String maxKey = "";
for(int i=0; i<N; i++) {
book[i] = br.readLine();
bookCount.put(book[i], 0);
}
for(int i=0; i<N; i++) {
if(bookCount.containsKey(book[i])) {
int getValue = bookCount.get(book[i]);
bookCount.put(book[i], ++getValue);
}
}
for (Map.Entry<String, Integer> entry : bookCount.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
if(value > maxValue || (value == maxValue && key.compareTo(maxKey) < 0)) {
maxKey = key;
maxValue = value;
}
}
System.out.println(maxKey);
}
}
반응형
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 1526번: 가장 큰 금민수 (브론즈1, 수학, 구현, 브루트포스 알고리즘, JAVA) (1) | 2024.01.27 |
---|---|
[백준] 1417번: 국회의원 선거 (실버5, 구현자료, 구조그리디, 알고리즘시뮬레이션, 우선순위 큐, JAVA) (1) | 2024.01.27 |
[백준] 1100번: 하얀 칸 (브론즈2, JAVA) (0) | 2024.01.20 |
[백준] 14916번: 거스름돈 (실버5, 그리디 알고리즘, JAVA) (0) | 2024.01.03 |
[백준] 14659번: 한조서열정리하고옴ㅋㅋ (브론즈1, 그리디 알고리즘, 50%~53% 시간초과, JAVA) (2) | 2023.12.29 |