[백준] 13334: 철로 - JAVA

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

풀이

n명의 사람에 대해 2개씩 점의 위치가 주어지고,

d길이의 선을 위치했을 때 2개의 점이 모두 선 안에 있는 사람의 최댓값을 구하는 문제이다.

입력을 받으면서 우선순위큐에 저장했다.

우선순위큐의 정렬 조건은 오른쪽 점을 오름차순으로, 오른쪽 점이 같을 경우 왼쪽 점을 오름차순으로 했다.

또 다른 우선순위큐을 만들어 개수를 세는 용도로 사용했다.

첫번째 우선순위큐를 pq라 하고, 두번째 우선순위큐를 count라고 했다.

pq에서 값을 빼서 count에 넣는다.

이때 선분 d의 오른쪽 점을 pq에서 뺀 값의 오른쪽 점으로 하고,

이 선분에 왼쪽 점이 속해있지 않는 값들을 count에서 뺀다.

그 후 최댓값을 count의 size와 비교하여 갱신한다.


메모리: 46684KB

시간: 784ms

언어: Java 11

코드

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

public class Main {
    static class Node implements Comparable<Node> {
        int left;
        int right;

        public Node(int left, int right) {
            this.left = left;
            this.right = right;
        }

        @Override
        public int compareTo(Node o) {
            if (this.right == o.right) {
                return Integer.compare(this.left, o.left);
            }
            return Integer.compare(this.right, o.right);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        PriorityQueue<Node> pq = new PriorityQueue<>();
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            pq.add(new Node(Math.min(a, b), Math.max(a, b)));
        }

        int d = Integer.parseInt(br.readLine());

        int max = 0;
        PriorityQueue<Integer> count = new PriorityQueue<>();
        while (!pq.isEmpty()) {
            Node curr = pq.poll();
            count.add(curr.left);

            while (!count.isEmpty() && curr.right - d > count.peek()) {
                count.poll();
            }

            max = Math.max(max, count.size());
        }

        System.out.println(max);
    }

}