Algorithm/Algorithm Problem

SWEA 1983 조교의 성적 매기기(Map)

땅지원 2022. 11. 4. 13:30
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

Map을 이용한 indexing 문제였다.

 

처음에 문제를 이해하는데 N / 10 이라는 조건이 헷갈렸지만 30명이 있을 때 3명은 똑같은 점수를 받을 수 있으니 마지막으로 구한 idx에 3으로 나눠야 grade배열에 index로 접근할 수 있다는 의미였다.

 

나는 여기서 Map을 이용했는데 key가 아닌 value로 정렬하는 법이 핵심이였다.

key로 정렬하는법은 TreeMap을 이용하면 간편하지만 value로 하기 위해선

list를 만들고 entitySet(), keySet()으로 초기화 시켜준다음 정렬하는게 포인트였다.

List<Integer> key_list = new ArrayList<>(map.keySet());
Collections.sort(key_list, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
 

[Java] Map 전체 출력(entrySet, keySet, Iterator, Lambda, Stream)

Map에 값을 전체 출력하기 위해서는 entrySet(), keySet() 메소드를 사용하면 되는데 entrySet() 메서드는 key와 value의 값이 모두 필요한 경우 사용하고, keySet() 메서드는 key의 값만 필요한 경우 사용합니

tychejin.tistory.com

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int T = Integer.parseInt(st.nextToken());
        for (int tc = 1; tc < T+1; tc++) {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());

            String[] grade = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0"};
            Map<Integer, Double> map = new HashMap<>();

            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());

                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                int c = Integer.parseInt(st.nextToken());
                map.put(i+1, a * 0.35 + b * 0.45 + c * 0.2);
            }
            List<Integer> key_list = new ArrayList<>(map.keySet());
            Collections.sort(key_list, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));

            int idx = key_list.indexOf(K) / (N/10);

            System.out.println("#"+tc+" "+grade[idx]);

        }


    }
}