본문 바로가기

알고리즘

[백준] BOJ2075 - N번째 큰 수 (JAVA)

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

 

2075번: N번째 큰 수

첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.

www.acmicpc.net

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

public class Main
{
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        PriorityQueue<Integer> queue = new PriorityQueue<>();

        //queue size는 5까지만 커질 수 있다
        int n = Integer.parseInt(br.readLine());

        for(int i=0;i<n;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<n;j++){
                int tmp = Integer.parseInt(st.nextToken());
                if(queue.size()<n)
                    queue.add(tmp);
                else{
                    if(queue.peek()>tmp) continue;
                    else{
                        queue.poll();
                        queue.add(tmp);
                    }
                }
            }
        }
        int ans = queue.poll();
        System.out.println(ans);

    }
}

 

슬라이딩 윈도우를 활용한 문제이다.

우선순위 큐의 크기를 n으로 설정하고 새로 들어오는 수가 queue.peek() 한 수보다 작으면 넘기고, 크다면 queue.poll()로 가장 작은 수를 빼내고 새로 추가한다.

전체 map을 돌고 나면 queue.poll()을 하면 n번째 큰 수를 구할 수 있다.