
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 |