

import java.util.Arrays;
import java.util.Comparator;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int studentCount = Integer.parseInt(st.nextToken());
int prizeStudentCount = Integer.parseInt(st.nextToken());
StringTokenizer st2 = new StringTokenizer(br.readLine());
Integer[] array = new Integer[studentCount];
for (int i = 0; i < studentCount; i++) {
array[i] = Integer.parseInt(st2.nextToken());
}
// Comparator.reverseOrder는 자료형이 제너릭(wrapper)일 때만(기본형X) 가능.
// ex) int[] 불가, Integer[] 가능
Arrays.sort(array, Comparator.reverseOrder());
int cutLine = array[prizeStudentCount - 1];
System.out.println(cutLine);
bw.flush();
bw.close();
br.close();
}
}
Arrays.sort() 메소드는 배열(Array)을 정렬할 때 사용되며,
기본형(primitive types) 배열과 래퍼(wrapper) 클래스 배열 모두를 정렬할 수 있다.
하지만 Comparator.reverseOrder()를 사용하는 경우에는 래퍼 클래스 배열에만 적용할 수 있다.
즉, int[], double[] 같은 기본형 배열에는 적용할 수 없고, Integer[], Double[] 같은 래퍼 클래스 배열에만 적용할 수 있다.
Collections.sort() 메소드는 컬렉션(Collection)을 정렬할 때 사용된다.
이 메소드는 List 인터페이스를 구현하는 객체에 대해서만 사용할 수 있으며, 기본형을 직접 담을 수 없다. 대신, 래퍼 클래스를 사용하여 객체로 된 컬렉션을 정렬할 수 있다.예를 들어, List, List 등의 타입을 정렬할 수 있다. 따라서 당연하게도 Collections.sort(reverseOrder)도 wrapper 클래스에게만 적용 가능하다.
기본형(Primitive Types): Java에서는 데이터의 가장 기본적인 형태를 나타내는 8가지 기본형을 제공한다. 이에는 byte, short, int, long, float, double, boolean, char 등이 있다. 기본형은 가장 효율적인 메모리 사용과 처리 속도를 제공하지만, 객체 지향적인 특성을 가지지 않는다.
래퍼 클래스(Wrapper Classes): 래퍼 클래스는 Java의 기본형에 대응하는 참조형 클래스다. 각 기본형 데이터를 객체로 다루기 위해 사용된다. 예를 들어, int의 래퍼 클래스는 Integer이고, double의 래퍼 클래스는 Double이다.
래퍼 클래스는 컬렉션에서 기본형 값을 객체로 다루기 위해 필요하며, 클래스이므로 객체 지향적인 특성과 메소드를 제공한다.
제너릭(Generic Types): 제너릭은 클래스나 메소드에서 사용할 타입을 파라미터로 받아서 사용할 수 있게 해주는 기능이다. 이를 통해 타입 안정성을 높이고, 형변환을 줄일 수 있다. 예를 들어, List는 정수형 객체만을 담을 수 있는 리스트를 선언할 때 사용된다. 제너릭을 사용하면 컴파일 시에 타입 체크를 할 수 있어 프로그램의 안정성을 높일 수 있다.