코딩가딩가

[JAVA]BOJ 1302, 베스트셀러

Noooodle 2024. 7. 25. 21:06

TreeMap을 잘 활용하면 되는 문제..

1. 책을 입력받는다.

2-1. 처음 입력받은 책이면 map에 'key=bookTitle, value=1' 으로 추가해준다.

2-2. 기존에 등록된 책이면 value만 +1 증가시켜준다.

3. value가 제일 큰 set을 찾아 출력한다.

 

1. 2-1. 2-2. 책을 입력받고 등록 유무를 확인해  value 지정하기

for(i=0;i<N;i++){
    bookTitle = br.readLine(); //1.

    //새로운 책인지 있던 책인지 확인하기
    if(!books.containsKey(bookTitle))
        books.put(bookTitle, 1); // 2-1. 새로운 책일때
    else
        books.put(bookTitle, books.get(bookTitle) + 1); // 2-2.등록된 책일때
}

새로운 책일때는.. 그냥 추가하면 되고, 등록된 책일때가 중요하다.

bookTitle로 원래 있던 set을 찾아서 해당 value를 가져오고 +1 해준다.

 

3. value가 제일 큰 set을 찾고 출력

Map.Entry<String, Integer> maxEntry = Collections.max(books.entrySet(), Map.Entry.comparingByValue());

System.out.println(maxEntry.getKey());

 

value가 가장 큰 set을 찾는 방법은 여러가지다. 그 중 Collections를 사용했다. 자료형이 map이라서 comparator를 정의해야 한다.

*Comparator 사용 이유 : List에서는 요소 자체를 비교하여 최대값을 쉽게 찾을 수 있지만, Map에서는 Map.Entry 객체를 활용하여 key나 value 기준으로 최대값을 찾기 위해 비교 로직을 명시적으로 정의해야 한다.

 

books.entrySet() : books의 모든 Entry를 Set으로 반환한다.

Map.Entry.comparingByValue() : Map.Entry 객체를 값(value)기준으로 비교할 수 있는 Comparator를 제공한다.

Collections.max : 주어진 Set에서 가장 큰 요소를 찾는다.

 

출력은 TreeMap으로 Map을 선언했기 때문에 그냥 출력해도 사전순으로 가장 빠른 key값이 나온다. TreeMap 되게 편리하다.


아래는 전체 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

public class BOJ1302 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N, i;
        String bookTitle;
        Map<String, Integer> books = new TreeMap<>();

        N = Integer.parseInt(br.readLine());

        for(i=0;i<N;i++){
            bookTitle = br.readLine();

            //새로운 책인지 있던 책인지 확인하기
            if(!books.containsKey(bookTitle))
                books.put(bookTitle, 1); // 새로운 책일때
            else
                books.put(bookTitle, books.get(bookTitle) + 1); // 등록된 책일때
        }

        Map.Entry<String, Integer> maxEntry = Collections.max(books.entrySet(), Map.Entry.comparingByValue());

        System.out.println(maxEntry.getKey());

//        books.forEach((key, value) -> System.out.println(key + " : " + value));
    }
}

 

*Entry<K, V>

Map의 키-값 쌍을 표현하는 객체

Map 인터페이스는 Map.Entry<K, V> 내부 인터페이스를 통해 각 키와 값을 하나의 객체로 나타낸다.

이 객체는 Map의 Entry(key와 value 쌍)를 다룰 수 있게 해준다.

 

*제공 메소드

getKey() : 엔트리의 키를 반환

getValue() : 엔트리의 값을 반환

setValue(v value) : 엔트리의 값을 반환

 

*장점 및 유용성

키와 값 접근: Map.Entry 객체를 사용하면 키와 값에 동시에 접근할 수 있어, Map의 데이터를 보다 쉽게 다룰 수 있다.

정렬 및 검색: Map.Entry를 사용하면 값에 따라 Map을 정렬하거나 검색하는 작업을 간단하게 수행할 수 있다.

 

 

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 2910, 빈도 정렬  (0) 2024.07.27
[JAVA]BOJ 18870, 좌표 압축  (0) 2024.07.26
[JAVA]BOJ 7785, 회사에 있는 사람  (0) 2024.07.25
[JAVA]BOJ 10814, 나이순 정렬  (0) 2024.07.24
[JAVA]BOJ 1181, 단어 정렬  (1) 2024.07.24