백준 코딩테스트

[백준] 베스트셀러 (1302) - Java

nan2 2023. 10. 29. 13:38
반응형

문제

김형택은 탑문고의 직원이다. 김형택은 계산대에서 계산을 하는 직원이다. 김형택은 그날 근무가 끝난 후에, 오늘 판매한 책의 제목을 보면서 가장 많이 팔린 책의 제목을 칠판에 써놓는 일도 같이 하고 있다.

오늘 하루 동안 팔린 책의 제목이 입력으로 들어왔을 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.


출력

첫째 줄에 가장 많이 팔린 책의 제목을 출력한다. 만약 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목을 출력한다.


예제 입력 1 

5
top
top
top
top
kimtop

예제 출력 1 

top

예제 입력 2

9
table
chair
table
table
lamp
door
lamp
table
chair

예제 출력 2

table
 

예제 입력 3

6
a
a
a
b
b
b

예제 출력 3

a
 

예제 입력 4

8
icecream
peanuts
peanuts
chocolate
candy
chocolate
icecream
apple

예제 출력 4

chocolate
 

내가 푼 코드

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

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());    // 오늘 팔린 책 수

        Map<String, Integer> map = new HashMap<>();
        for (int i=0; i<N; i++) {
            String name = br.readLine();
            if (!map.containsKey(name)) {
                map.put(name, 1);
            } else {
                map.put(name, map.get(name) + 1);
            }
        }

        // values 최대값 찾기
        int maxValue = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (maxValue < entry.getValue()) {
                maxValue = entry.getValue();
            }
        }

        // 최대값 책 제목 구하기
        List<String> names = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (maxValue == entry.getValue()) {
                names.add(entry.getKey());
            }
        }
        
        // 알파벳 오름차순 정렬
        Collections.sort(names);
        System.out.println(names.get(0));
    }
}

 

1. Map을 사용하여 key에는 책 제목, value에는 책이 팔린 횟수를 넣어준다.

2. value 에서 가장 큰 값을 maxValue에 담아준다.

3. map을 순회하면서 maxValue와 같이 같은 key를 list에 넣어준다.

4. list를 오름차순 정렬하여, 맨 앞의 값을 출력한다.

 

 

 

 

 

*** Map 순회하는 메서드 entrySet() 과 keySet()

entrySet()은 key와 value 모두 뽑아낼 수 있고, keySet은 key로 map.get(key)하여 value 값을 출력할 수 있다.

// entrySet()
for (Entry<String, Integer> entry : map.entrySet()) {
	String key = entry.getKey();
    int value = entry.getValue();
}

// keySet()
for (String key : map.keySet()) {
	int value = map.getKey(key);
}
반응형