✅ 오늘의 학습 키워드
- HashMap을 값 기준으로 재정렬하기
- Map.Entry 인터페이스 활용하기
🔍 오늘의 문제 분석
- 학생들의 이름 n가 주어진다
- n 줄까지 학생의 이름이 공백으로 구분된 문자열이 주어진다
- 인기도가 높은 학생부터 낮은 학생 순으로 출력
- 인기도가 같은 경우 학생 이름 기준으로 오름차순으로 출력
✨ 오늘의 회고
📌내가 적은 답안📌
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
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());
StringTokenizer st = new StringTokenizer(br.readLine()); //학생 이름
HashMap<String, Integer> map = new HashMap<>();
while (st.hasMoreTokens()) {
map.put(st.nextToken(), 0);
}
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
while (st.hasMoreTokens()) {
String name = st.nextToken();
map.put(name, map.getOrDefault(name, 0) + 1);
}
}
List<Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
if (o1.getValue().equals(o2.getValue())) {
return o1.getKey().compareTo(o2.getKey());
}
return o2.getValue() - o1.getValue();
}
});
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
1️⃣첫번째로 각 학생이 받은 득표수를 구하기 위해서 HashMap과 getOrDefault 메서드를 사용해서 학생 이름과 득표수를 저장하도록 했다. 키가 존재하지 않으면 기본값 0을 반환하는 것을 이용해서 HashMap에서 key 값을 조회한 후 1을 증가시켜 주었다. BufferedReader와 StringTokenizer를 사용해서 입력을 효율적으로 저장할 수 있었다.
map.put(name, map.getOrDefault(name, 0) + 1)
2️⃣Map.Entry<K,V>는 맵의 키와 값을 모두 나타내는 인터페이스로, 이름(key)과 득표수(value) 값으로 정렬이 필요했기 때문에 이 인터페이스를 사용하게 되었다. map.entrySet() 메서드로 Set<Map.Entry<K, V>> 형태로 ArrayList에 담았다.
List<Entry<String, Integer>> list = new ArrayList<>(map.entrySet())
3️⃣ArrayList에 담긴 엔트리 셋을 Comparator 클래스를 구현해서 요구사항에 맞도록 정렬을 구현했다. 득표수가 같을 경우 이름을 기기준으로 사전순으로 정렬하고, 득표수가 다를 경우 값을 기준으로 내림차순 정렬했다.
오늘의 문제를 통해서 HashMap을 값 기준으로 정렬하려면 일단 List로 변환해야 한다는 점과 map.entrySet()을 ArrayList의 생성자로 맵에 저장된 데이터 셋을 쉽게 변환할 수 있다는 것을 배울 수 있었다.
'알고리즘 > [항해99] 1일 1알고리즘 스터디' 카테고리의 다른 글
| 99클럽 코테 스터디 17일차 TIL ✒️두 배열 사이의 거리 구하기 (0) | 2025.04.23 |
|---|---|
| 99클럽 코테 스터디 16일차 TIL ✒️Intersection of Two Arrays (0) | 2025.04.21 |
| 📑주니어 개발자가 면접을 앞두고 준비한 것들 (0) | 2025.04.17 |
| 99클럽 코테 스터디 14일차 TIL ✒️브실이의 입시전략 (0) | 2025.04.17 |
| 99클럽 코테 스터디 13일차 TIL ✒️단어 정렬 (0) | 2025.04.17 |