코딩 테스트/백준

[백준] 1302번: 베스트셀러 (실버4, 자료구조, 문자열, 정렬, 해시를사용한 집합과 맵 JAVA)

Nirsa 2024. 1. 20. 13:04
반응형

 

문제 링크 : 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);
    }
}
반응형