알고리즘/[항해99] 1일 1알고리즘 스터디

99클럽 코테 스터디 15일차 TIL ✒️학생 인기도 측정

hooooolly 2025. 4. 19. 08:37

✅ 오늘의 학습 키워드

  • 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의 생성자로 맵에 저장된 데이터 셋을 쉽게 변환할 수 있다는 것을 배울 수 있었다.