백준 – 1302 – 베스트셀러

HashMap으로 알고리즘 문제를 해결하는 방법에 대해 제가 모르는 부분을 명확히 하고자 합니다.

https://www.acmicpc.net/problem/1302

(문제)

김형택은 탑문고 직원이다. 김형택은 계산대 계산원이다. 김형택은 그날 퇴근 후 오늘 팔린 책의 제목을 보고 가장 잘 팔린 책의 제목을 칠판에 적는다.

(기입)

첫 번째 줄은 N에게 하루 동안 판매된 책의 수를 제공합니다. 이 값은 1,000보다 작거나 같은 자연수입니다. 두 번째 줄부터는 책 제목을 N줄로 입력한다. 책 제목의 길이는 50자 이하로 알파벳 소문자로만 구성한다.

(누르다)

베스트셀러 책의 제목을 첫 줄에 인쇄하십시오. 베스트셀러 책이 여러 권 있는 경우 알파벳 순서로 먼저 오는 제목을 인쇄하십시오.


(설명)

1. 해시맵(HashMap) 사용).

2. 해시맵의 키 값으로 책 제목을 입력합니다.

3. 해쉬맵의 값은 책명이 입력될 때마다 1씩 증가합니다.

4. 모든 항목을 수신한 후 값이 가장 큰 항목을 찾습니다.

5. 값이 같으면 문자열 비교를 통해 알파벳순으로 키가 먼저 옵니다.

(입장)

1. 책 제목에 해당하는 값을 입력하고 그 값에 해당하는 번호를 알고 있어야 합니다.

2. 배열을 하나하나 생성하는 것이 번거로우므로 그룹화 및 관리가 가능한 HashMap을 사용한다.

3. HashMap에 입력된 값을 반복하여 가장 큰 값을 가진 것을 찾는다.

4. 값이 같으면 가장 빠른 것을 알파벳순으로 출력하라는 문제이므로 문자열을 비교하여 가장 작은 것을 출력할 수 있습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class B_1302 {

    public static void main(String() args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int size = 0; // 정답의 개수
        String result = ""; // 정답 문자열

        HashMap<String, Integer> map = new HashMap<>();

        for(int i = 0 ; i < N; i++){
            String str = br.readLine();
			
            // 이미 있는 단어라면 해당 단어의 값을 1 증가
            if(map.containsKey(str)){
                map.put(str, map.get(str) + 1);
            }
            // 없다면 새로 만들어서 1로 담는다.
            else {
                map.put(str, 1);
            }
        }
		
        // 가장 많이 나온 것 찾기
        for(String key : map.keySet()){
            if(size < map.get(key)){  // 현재 결과의 개수보다 많으면
                size = map.get(key);  // 개수를 변경
                result = key;  		  // 정답을 변경
            }
             else if(size == map.get(key)){  // 현재 결과의 개수와 같다면
                if(result.compareTo(key) > 0){ // 문자열 비교를 통해
                    result = key;  // 사전순으로 더 빠른 경우 변경
                }
            }
        }
        System.out.println(result);
    }
}

참조 블로그:
https://blackvill.39