알고리즘 공부/문제 풀이

[JAVA] 백준 13334 철로

valid_ming 2021. 10. 22. 14:04

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

 

13334번: 철로

입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0

www.acmicpc.net

이런 문제는 항상 오름차순 정렬을 하고 봐야하는 것 같다.

정렬한 후에 주어진 선분을 정보의 왼쪽이나 오른쪽 끝 값에 대보며 개수를 구하고, 반대쪽에서 정답 만족하는지 체크

이 문제 같은 경우는 오른쪽에 선분을 맞춰 이동시키며 왼쪽에서 정답 만족하지 않는 출근길들 빼내기

 

아래 블로그가 굉장히 설명이 잘 되어있다.

https://chanhuiseok.github.io/posts/baek-28/

 

[백준] 13334번 - 철로

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io

 

 

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

public class Main {
    public static class Info implements Comparable<Info>{
        int left, right;
        public Info(int l, int r){
            left = l; right = r;
        }
        public int compareTo(Info o){
            if(right==o.right) return left-o.left;
            else return right-o.right;
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        ArrayList<Info> list = new ArrayList<>();

        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());
            list.add(new Info(Math.min(a,b), Math.max(a,b)));
        }

        int d = Integer.parseInt(br.readLine());
        Collections.sort(list);
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int answer = 0;
        for(int i=0;i<N;i++){
            Info info = list.get(i);
            if(info.right - info.left>d) continue;

            pq.add(info.left);
            while(!pq.isEmpty()){
                if(info.right-pq.peek()<=d) break;
                pq.poll();
            }
            answer = Math.max(answer, pq.size());
        }

        System.out.println(answer);
    }
}