
입력으로 주어진 수 중에서 N번째로 큰 수를 찾는 문제
우선순위 큐를 사용하면 될 것 같다!
최소힙으로 설정해 힙에 다 넣고 N개 이상의 수가 들어올 때마다 들어온 수에서 가장 작은 수 빼기
BufferedReader : 입력 받아야 할 데이터가 많을 경우 버퍼에 한 번에 다 모아서 전달하기 때문에 빠르고 효율적!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class N번째_큰_수 {
public static void main(String[] args) throws IOException{
//버퍼리더 선언(외부 리소스로부터 입력을 받기 때문에 이 과정에서 예외가 발생 가능)
//따라서 자바가 강제로 예외 처리 요구
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//엔터를 경계로 라인단위로 입력받고 문자열로 들어옴
//따라서 정수형이라면 형변환 필수
int N = Integer.parseInt(bf.readLine());
//우선순위 큐(정수형으로 이뤄진) 생성
PriorityQueue<Integer> pq = new PriorityQueue<>();
//N * N 만큼의 정수 입력받기
for (int i=0; i<N; i++) {
//문자열을 띄어쓰기로 입력받을 예정이라
//스트링토크나이저로 쪼개서 입력받기기
StringTokenizer st = new StringTokenizer(bf.readLine());
for (int j=0; j<N; j++) {
int num = Integer.parseInt(st.nextToken());
//입력받은 값을 우선순위 큐에 넣어주기기
pq.add(num);
//N개보다 많은 수가 큐에 들어왔을 때때
if (pq.size() > N) {
//루트 노드(가장 작은 값) 빼주기
pq.poll();
}
}
}
//최소힙에서 루트 노드(가장 작은수 == 전체 수에서 N번째로 큰 수 출력)
System.out.println(pq.peek());
}
}