알고리즘

백준 2565번 전깃줄 (JAVA)

박카스마시며코딩 2024. 1. 5. 17:30

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

 

2565번: 전깃줄

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는

www.acmicpc.net

 

저는 LIS를 통해 문제를 풀었습니다.

A를 기준을 봤을 때 A가 증가함에 따라 B가 증가한다면, 전기줄들은 만나지 않을 것 입니다. 그래서 최장 증가수열을 구하고 이 값을 n에서 뺸 값을 통해 문제를 풀었습니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class BOJ_2565_2 {
    private static class Edge{
        int a;
        int b;
        public Edge(int a, int b){
            this.a = a;
            this.b = b;
        }
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<Edge> edges = 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());
            edges.add(new Edge(a, b));
        }
        Collections.sort(edges,(v1,v2)->{
            return v1.a - v2.a;
        });
        int[] LIS = new int[n];
        int max = 1;
        Arrays.fill(LIS,1);
        for(int i = 0 ; i < n ; i++){
            for(int j = i + 1 ; j < n ; j++){
                if(edges.get(i).b < edges.get(j).b && LIS[i] + 1 > LIS[j]){
                    LIS[j] = LIS[i] + 1;
                    max = Math.max(LIS[j], max);
                }
            }
        }
        System.out.println(n - max);
    }
}