suheang

[백준] | JAVA, 자바 | 25305번 - 커트라인 본문

알고리즘

[백준] | JAVA, 자바 | 25305번 - 커트라인

suheang 2024. 3. 5. 21:27

https://www.acmicpc.net/problem/25305

 

25305번: 커트라인

시험 응시자들 가운데 1등은 100점, 2등은 98점, 3등은 93점이다. 2등까지 상을 받으므로 커트라인은 98점이다.

www.acmicpc.net


문제 요약 :

N명의 학생들이 응시하고 점수가 가장 높은 명은 상을 받는다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.

(커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다.)


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main {
    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 k = Integer.parseInt(st.nextToken());
        Integer[] scores = new Integer[n];

        StringTokenizer st2 = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            scores[i] = Integer.parseInt(st2.nextToken());
        }

        Arrays.sort(scores, Comparator.reverseOrder());

        System.out.println(scores[k-1]);
    }
}

 

1. 응시한 학생 수n 과 상 받는 학생 수 k를 입력받기

2. Intger을 통해 점수를 저장할 배열 생성

(Int가 아닌 Intger을 사용하는 이유는 Arrays.sort의 Comparator.reverseOrder()을 사용하기 위해서)

3. 점수를 입력받고 정렬함

4. 상 받는 학생 중 가장 낮은 점수 출력


Comparator.reverseOrder()를 사용하는 이유는 입력받은 점수들을 내림차순으로 정렬을 하기 위함이다.

 

Arrays.sort를 사용하면 오름차순으로 정렬이 되는데 문제는 높은 점수부터 k명이기 때문에 내림차순 정렬을 해야한다.

내림차순 정렬을 하는 방법을 찾아봤는데 Comparator.reverseOrder()를 사용하면 내림차순 정렬을 사용할 수 있다. 단, 이 기능을 사용하기 위해선 Int 배열이 아닌 Integer 배열을 사용해야하는데 그 이유는 개념 사이의 차이 때문이라고 한다.

 

기본 타입과 래퍼 클래스 : Comparator.reverseOrder() 메서드는 내부적으로 Comparator 인터페이스를 구현한 객체를 비교하는 방식으로 작동하는데 여기서 int는 기본 데이터 타입으로 객체가 아니기 때문에 Comparator 인터페이스를 직접 구현할 수 없다.

따라서 int를 사용해서 Comparator.reverseOrder()를 호출할 수 없다. Integer 클래스는 int 값을 감싸는 래퍼 클래스로, 객체다. 따라서 Comparator.reverseOrder()는 Integer 객체에 대해 사용될 수 있다.