백준

백준 1302: 베스트셀러(java)

unhyepnhj 2024. 8. 7. 18:28

문제


풀이

 

제목과 해당하는 판매 횟수를 대응시켜야 하므로 HashMap<String, Integer>를 사용하였으며, 풀이 과정은 크게 아래 3단계와 같다.

  1. 제목을 입력받아 처음 등장하는 제목일 경우 <제목, 1>을 put하고 이전에 등장한 적 있는 제목일 경우 <제목, get(제목)+1>을 put
  2. 판매 횟수가 가장 많은 책들을 별도의 리스트에 저장
  3. 2번의 리스트를 알파벳 순으로 정렬하여 첫 번째 요소를 출력
int max=0;
for(int i=0; i<N; i++) {
	String str=br.readLine();
	hm.put(str, hm.getOrDefault(str, 0)+1);	//hm은 해시맵 객체
	max=Math.max(max, hm.get(str));
}

 

getOrDefault() 메소드를 이용해 해시맵에 str이 존재할 경우 str에 대응하는 value를 호출하여 1을 더하고, 없을 경우 default값인 0을 호출하여 1을 더한다(=1 삽입).

Math.max() 메소드를 이용해 해시맵 내 value들을 그때그때 비교하여 최대 판매 횟수를 max에 저장하고,

List<String> maxKeys=new ArrayList<>();
for(Map.Entry<String, Integer> entry : hm.entrySet()) {
	if(entry.getValue()==max)
		maxKeys.add(entry.getKey());
}

value==max인 요소들을 maxKey 리스트에 따로 저장한다.

Map.Entry를 사용하여 맵에 저장된 key-value 쌍을 하나의 객체로 저장할 수 있으며, getValue() 메소드를 이용해 value에 접근할 수 있다(getKey()도 마찬가지)

Collections.sort(maxKeys);

이후 Collections.sort() 메소드를 이용해 maxKey 리스트의 요소들을 오름차순으로 정렬한다.

 

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		HashMap<String, Integer> hm=new HashMap<>();
		
		int N=Integer.parseInt(br.readLine());
		int max=0;
		for(int i=0; i<N; i++) {
			String str=br.readLine();
			hm.put(str, hm.getOrDefault(str, 0)+1);
			max=Math.max(max, hm.get(str));
		}
		List<String> maxKeys=new ArrayList<>();
		for(Map.Entry<String, Integer> entry : hm.entrySet()) {
			if(entry.getValue()==max)
				maxKeys.add(entry.getKey());
		}
		Collections.sort(maxKeys);
		
		System.out.println(maxKeys.get(0));
	}
}