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

99클럽 코테 스터디 14일차 TIL ✒️브실이의 입시전략

hooooolly 2025. 4. 17. 18:00

✅ 오늘의 학습 키워드

  • HashMap과 ArrayList를 활용하여 중복 제거 및 정렬하기
  • 정렬한 리스트에서 최솟값과 최댓값 구하기

🔍 오늘의 문제 분석

↘️ 오늘의 문제 바로가기 ↘️

 

  • 브실이는 N개의 과목을 수강함
  • 브실대학은 M개 과목의 점수를 요구
  • 브실대학은 M개 과목 중 K개의 과목만 공개함
  • 공개한 과목 K개와 공개하지 않은 과목 (M-K) 개 점수의 최솟값과 최댓값을 출력
  • 공개된 과목과 비공개된 과목은 브실이가 수강한 과목에 모두 포함
  • 과목은 중복되지 않는다

오늘의 문제는 HashMap과 ArrayList를 활용해서 Key와 Value 형식으로 값을 저장하고 정렬을 통해서 최댓값과 최솟값을 계산하는 문제였다.


✨ 오늘의 회고

📌내가 적은 답안📌

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {

  public static HashMap<String,Integer> getHashMap(String line, HashMap<String, Integer> map) {
    StringTokenizer st = new StringTokenizer(line);
    map.put(st.nextToken(), Integer.parseInt(st.nextToken()));
    return map;
  }

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int n = Integer.parseInt(st.nextToken()); //브실이가 수강한 과목 수
    int m = Integer.parseInt(st.nextToken()); //브실대학에서 요구하는 과목 수
    int k = Integer.parseInt(st.nextToken()); //브실대학에서 공개한 과목 수

    HashMap<String, Integer> map = new HashMap<>();
    while (n-- > 0) {
      String line = br.readLine();
      map = getHashMap(line, map);
    }

    int answer = 0;

    for (int i = 0; i < k; i++) {
      String line = br.readLine();
      answer += map.get(line);
      map.remove(line);
    }
    
    /*
    while (k-- > 0) {
      String line = br.readLine();
      answer += map.get(line);
      map.remove(line);
    }*/

    ArrayList<Integer> list = new ArrayList<>(map.values());
    Collections.sort(list);

    int min = answer;
    int max = answer;

    for (int i = 0; i < m - k; i++) {
      min += list.get(i);
    }

    for (int i = list.size() - 1; i >= list.size() - (m - k); i--) {
      max += list.get(i);
    }

    System.out.println(min + " " + max);

  }
}

오늘 문제는 어제 Collections.sort 메서드를 사용해봐서 크게 막히지 않고 풀 수 있었다. 처음 코드를 작성할 때 HashMap 초기화 시 null 대신 새 인스턴스로 초기화해야 한다는 것을 알게 되었다. (NullPointer 에러 발생) 그리고 k 값을 주석 처리된 부분처럼 작성하면 변수 k 값이 0으로 변경되기 때문에 나중에 최소, 최댓값을 계산할 때 오류가 발생했다. 만약에 변수의 값을 변경하지 않고 다시 써야 한다면 for문에서 임시 변수를 선언해서 사용하거나, 원래의 값을 다른 변수에 따로 저장해둬야 한다는 것을 배웠다.