백준 1302번: 베스트셀러
문제 설명
- https://www.acmicpc.net/problem/1302
- 입력으로 주어지는 문자열 중 빈도수가 가장 높은 문자열을 출력하는 문제입니다.
- 빈도수가 동일하면 사전순으로 앞서는 문자열을 출력해야 합니다.
접근법
- Map은
값이 등장한 횟수
를 표현하기 좋은 자료구조 입니다.
pseudocode
for(){
if(처음 등장하는 제목이면){
map.put(제목,1) // 해당 책이 1번 등장했음
}else{ // 등장한 제목이면
map.put(제목,map.get(제목)+1)
}
if(최댓값이 갱신되면){
비교값 갱신
}
if(최댓값과 동률이면){
문자열 순서비교
}
}
정답
import java.util.*;
public class Main {
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<String,Integer>();
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int MaxInt = 0;
String MaxString = "";
sc.nextLine();
for (int i = 0; i < N; i++) {
String key = sc.nextLine();
// 해당 제목이 처음 등장했으면
if(map.get(key) == null) {
map.put(key,1); // 등장횟수 1
}else { // 해당 제목이 재등장했으면
map.put(key, map.get(key)+1); // 등장횟수 + 1
}
// 만약 기존의 최대등장횟수보다 val의 등장횟수가 더 크면 새로운 최댓값으로 교체
if(map.get(key)>MaxInt) {
MaxInt = map.get(key);
MaxString = key;
}
// 등장횟수가 동일하면 사전순으로 비교해서 최댓값 결정
if(map.get(key) == MaxInt) {
if(MaxString.compareTo(key)>0) {
MaxString = key;
}
}
}
System.out.println(MaxString);
}
}
기타
문제는 쉽지만 배운게 많았습니다.
- 존재하지 않는 key값으로 get을 하면 null을 반환합니다.
- Map의 value값을 +=1로 증가시킬 수 없고 다시 put을 해야 합니다.
map.put(val, map.get(val)+1);
- String의 사전순 비교는
.compareTo()
메서드를 사용할 수 있습니다.S1.compareTo(S2)
가 0보다 크면 S2가 사전순으로 앞선다는 의미입니다.- 헷갈리기 때문에 그냥
"A".compareTo("B")
와"B".compareTo"A"
출력해 보시길 추천합니다.
- 헷갈리기 때문에 그냥
Author And Source
이 문제에 관하여(백준 1302번: 베스트셀러), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qwerty1434/백준-1302번-베스트셀러저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)