커트라인(25305)

k번째로 큰 수를 구하는 문제

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

문제

2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 N 명의 학생들이 응시했다.

이들 중 점수가 가장 높은 k 명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.

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

입력

첫째 줄에는 응시자의 수 N과 상을 받는 사람의 수 k 가 공백을 사이에 두고 주어진다.

둘째 줄에는 각 학생의 점수 x 가 공백을 사이에 두고 주어진다.

출력

상을 받는 커트라인을 출력하라.

예제 입력

5 2
100 76 85 93 98

예제 출력

98

일단 ArrayList을 사용해서 소팅을 하고, 이게 오름차순이니까 뒤에서부터 찾아서 출력하는 방식을 선택했고 문제도 맞았음 근데 일단 뭔가 단순 배열[] 보다 ArrayList에 익숙했고 소팅같은것도 잘 되어있어서 사용했는데 아차 싶었다 다행히도 찾아보니까 배열의 크기를 resize() 통해서 진행하는 케이스에서는 확실하게 성능이슈가 발생하지만 단순히 add(), remove() 와 같이 넣다뺐다 하면서 그렇게 많은 양을 넣고빼는게 아니기 때문에 사용해도 괜찮을 것 같다

풀이

import java.io.*;
import java.util.*;
public class conditional_25305{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int totalCnt = Integer.parseInt(st.nextToken());
        int winnerCnt = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<totalCnt; i++){
            list.add(Integer.parseInt(st.nextToken()));
        }

        list.sort(Integer::compareTo);
        System.out.println(list.get(totalCnt - winnerCnt));
    }
}

그래도 까먹은거 같애서 배열로도 다시 풀어보았다 아오 Arrays.sort(배열, Collections.reverseOrder()) 함수에서 배열이 프리미티브 타입이면 안되고 래퍼 타입이여야 되는거였다니.... 오늘도 하나 배웠습니다 감사합니다

import java.util.*;
import java.io.*;

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 totalCnt = Integer.parseInt(st.nextToken());
        int winnerCnt = Integer.parseInt(st.nextToken());

        Integer[] arr = new Integer[totalCnt];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr, Collections.reverseOrder());
        System.out.println(arr[winnerCnt-1]);
    }
}

Last updated

Was this helpful?