Jakorithm
article thumbnail
728x90

문제

https://www.codetree.ai/training-field/search/problems/class-attitude-assessment?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 

코드

Bessie, Elsie, Daisy, Gertie, Annabelle, Maggie, 그리고 Henrietta까지 총 7명의 학생에게 수업 태도 점수를 부여했을 때, 두 번째로 낮은 학생의 이름을 출력하는 문제다.

첫 번째 줄에 정수 N이 주어지고, 두 번째 줄부터 N개의 줄에 걸쳐 이름과 점수를 공백(" ")을 기준으로 주어진다.

  • 입력으로 주어진 적이 없는 학생의 경우, 총 수업 태도 점수를 0점으로 계산해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
        Map<String, Integer> scoreMap = new HashMap<>();
        // scoreMap에 이름과 점수 담기
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            String name = st.nextToken();
            int score = Integer.parseInt(st.nextToken());

            scoreMap.put(name, scoreMap.getOrDefault(name, 0) + score);
        }

        List<String> keySet = new ArrayList<>(scoreMap.keySet());
        // keySet의 길이가 1인 경우, 해당 학생이 가장 높은 점수이자 두 번쨰로 낮은 점수
        if (keySet.size() == 1) {
            System.out.println(keySet.get(0));
            return;
        }

        // value를 기준으로 scoreMap 오름차순 정렬
        keySet.sort((o1, o2) -> {
            return scoreMap.get(o1).compareTo(scoreMap.get(o2));
        });

        int min = scoreMap.get(keySet.get(0));
        String secondKey = "";
        // 두 번째로 낮은 점수의 학생 구하기
        for (String key : keySet) {
            if (scoreMap.get(key) > min) {
                secondKey = key;
                break;
            }
        }

        // secondKey가 빈 경우 모두 같은 점수
        if (secondKey.isEmpty()) {
            System.out.println("Tie");
        } else {
            System.out.println(secondKey);
        }
    }
}
  • 학생의 이름과 점수를 map에 담아 두 번째로 낮은 점수를 가진 학생의 이름을 출력할 수 있다.
  • 만약, map의 길이가 1인 경우 한 학생을 제외한 나머지 학생은 모두 점수가 0이므로 map에 담겨 있는 학생이 최고 점수이자 두 번째로 낮은 점수가 된다.
  • 오름차순 정렬된 map의 첫 번째 value는 가장 낮은 점수가 되며, 다음으로 높은 점수를 가진 학생이 두 번째로 낮은 점수를 가진 학생이 된다.
  • 만약 다음으로 높은 점수를 가진 학생이 없는 경우, map에 담긴 학생들이 두 번째로 높은 점수를 가졌으며 여려 명이 된다. 따라서 Tie를 출력한다.
728x90