본문 바로가기
코테 - 자바

99클럽 코테 스터디 18일차 TIL + 정렬(2)

by BIGENGINEER 2025. 4. 17.

브실이의 입시전략

 

 

문제

올해 고3인 브실이는 세계 최고의 명문 대학 브실대학(브론즈실버대학)에 가기 위해서 자신의 현재 점수를 토대로 입시 전략을 세우려고 한다. 브실대학에서는 특정 과목들의 성적의 합을 통해 서류 전형의 합격여부를 결정한다고 한다. 그러나 브실대학에서는 어떤 과목이 서류 평가에 반영되는지 모두 알려주지 않고 일부만 알려주는 사악한 학교다. 브실대학에서 요구하는 과목 수와 반영된다고 공개된 과목들이 주어질 때, 브실이가 얻을 수 있는 최소 점수와 최대 점수를 구해보자.

단, 공개된 과목과 비공개된 과목은 브실이가 수강한 과목에 모두 포함되어 있으며, 과목은 중복되지 않는다.

입력

첫 번째 줄에 브실이가 수강한 과목 수 N과 브실대학에서 요구하는 과목 수 M, 그리고 브실대학에서 공개한 과목 수 K가 공백으로 구분되어 주어진다. (1≤K≤M≤N≤10000)

그다음 N줄에 걸쳐 브실이가 수강한 과목 이름 si과 정수 점수 pi가 공백으로 구분되어 주어진다. si는 영어 소문자로만 이루어져 있다. (3≤|si|≤20; 0≤pi≤100)

그다음 K줄에 걸쳐 브실대학에서 공개한 과목 이름 ti가 주어진다. ti는 영어 소문자로만 이루어져 있다. (3≤|ti|≤20)

출력

브실이가 얻을 수 있는 최소 점수와 최대 점수를 공백으로 구분하여 출력한다.

예제 입력 1 

6 3 2
calculus 100
probability 70
physics 50
chemistry 80
python 90
algorithm 100
physics
python

예제 출력 1 

210 240

 

 


1) 숫자 차례대로 받아오고 - 공백에 따라 받아오기

2) hashMap에 수강한 과목이랑 점수 값 받아와서 저장

 

 

<1차 코드>

import java.util.HashMap;
import java.util.Scanner;

public class DAY14 {
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        sc.nextLine();

        HashMap<String, Integer> map = new HashMap<>();

        for(int i=0; i<n; i++){
            String str = sc.nextLine();
            int score = sc.nextInt();
            map.put(str, score);
        }

        System.out.println(map);

    }
}

 

 

- 출력해보면 오류 뜸

-> 당연함. 

 

> 해야할 것

- 처음에 받아온 정수들을 어떻게 저장할 지 ..

- nextInt()로 해도 공백으로 구분된 숫자들이 차례대로 받아와지는건가 ?

 

 

** 이렇게 하기

	String[] input = sc.nextLine().split(" ");
        int[] num = new int[input.length];
        for(int i=0; i<input.length; i++){
            num[i] = Integer.parseInt(input[i]);
        }

 

- " " 공백 기준으로 구분된 문자열을 받아오고, int 배열 생성해서 input 배열 정수로 변환한 것 넣기

 

> 그럼 hash에 저장할 때 반복문 마지막 숫자를 뭐로 정해야 되는겨?

-> 수강하는 과목 수는 항상 처음에 받아오기 때문에 num[0]으로 하면 되지 않을까?

 

 

 

 

< 2차 코드>

 

1.

	int N = sc.nextInt();
        int M = sc.nextInt();
        int K = sc.nextInt();
        sc.nextLine();


        HashMap<String, Integer> map = new HashMap<>();

        for(int i=0; i<N; i++){
            String[] str = sc.nextLine().split(" ");
            String subject = str[0];
            int score = Integer.parseInt(str[1]);
            map.put(subject, score);
        }


        Set<String> set = new HashSet<>();
        for(int i=0; i<M; i++){
            String openSub = sc.nextLine();
            set.add(openSub);
        }

 

- 수강 과목 수, 요구 과목 수, 공개 과목 수 받아와서 map에 차례대로 저장하고

- set 사용해서 공개 과목 수 저장

 

 

2. 

       int fixedScore = 0;
        List<Integer> remainScore = new ArrayList<>();
        for(Map.Entry<String, Integer> entry : subjectScore.entrySet()){
            String subject = entry.getKey();
            int score = entry.getValue();
            
            if(openSubject.contains(subject)){
                fixedScore+=score;
            }else{
                remainScore.add(score);
            }
        }

 

- 총점 저장할 변수 지정하고

- 선정되지 않은 과목 저장할 리스트 생성

- 공개된 과목과 같으면 해당 과목 점수를 더하는 식으로 반복문 구성

 

** 중요

1) map에 저장된 과목이랑 점수 꺼내기 위해서 for-each문 사용할 껀데 Map은 키와 값을 동시에 꺼낼 수 없기 때문에 

Map.Entry를 사용해야함.

 

2)

.entrySet()

 

- Map의 모든 (키, 값) 쌍을 Set<Map.Entry<K, V>> 형태로 반환하는 메서드라 entry로 키와 값을 가지고 올 수 있음

 

 

  • Map.Entry<K, V>는 Map의 한 쌍의 항목(Entry) 을 의미함
  • getKey() → 키 가져오기
  • getValue() → 값 가져오기
  • Map.entrySet() → 전체 항목 쌍을 Set 형태로 반환해서 반복 가능하게 해줌

 

 

3. 

Collections.sort(remainScore);

 

- 리스트를 정렬해주는 메서드로 오름차순으로 정렬해줌.

 

 

 

4. 

 		//요구 - 공개
        int extra = M-K;

        int min = 0;
        int max = 0;

        //최소
        for(int i=0; i<extra; i++){
            min +=remainScore.get(i);
        }

        //최대
        for(int i=remainScore.size()-1; i>=remainScore.size()-extra; i--){
            max +=remainScore.get(i);
        }

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

 

- 최소일 때와 최대일 때 구하기 

- 최대일 때 구하는 for 문 주의 

 


1차 코드보면 간단했는데 허허..

어렵다 근데 넘나 재밌다

 

< 배운 것 >

- Map에서 for - each로 키와 값을 동시에 가져올 수 없으니 Map.Entry 사용하고, 

- 반복해서 값 꺼내오기 위해서 Map.entrySet()사용해서 Set으로 변환하기

- Collections.sort()로 오름차순 정렬

 

 

재밌음!!