백준 2075 - N번째 큰 수

김예림·2025년 4월 27일

문제 파악

입력으로 주어진 수 중에서 N번째로 큰 수를 찾는 문제
우선순위 큐를 사용하면 될 것 같다!
최소힙으로 설정해 힙에 다 넣고 N개 이상의 수가 들어올 때마다 들어온 수에서 가장 작은 수 빼기

풀이

  1. N번째로 큰 수를 찾기 위한 N을 입력받는다.
  2. N * N개의 수를 입력받아야 하기 때문에 버퍼리더 사용

    BufferedReader : 입력 받아야 할 데이터가 많을 경우 버퍼에 한 번에 다 모아서 전달하기 때문에 빠르고 효율적!

  1. 입력 받은 값들을 우선순위 큐에 넣어준다.
    a. N개보다 많은 값이 넣어졌을 때 가장 작은 수 빼주기
  2. 최소힙의 peek 값 출력

코드

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());
    }
}

0개의 댓글