[백준] 전깃줄 - Java

2025. 5. 2. 13:22·알고리즘

문제 출처

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

문제

두 전봇대 A와 B 사이에 하나 둘씩 전깃줄을 추가하다 보니 전깃줄이 서로 교차하는 경우가 발생하였다. 합선의 위험이 있어 이들 중 몇 개의 전깃줄을 없애 전깃줄이 교차하지 않도록 만들려고 한다.

예를 들어, < 그림 1 >과 같이 전깃줄이 연결되어 있는 경우 A의 1번 위치와 B의 8번 위치를 잇는 전깃줄, A의 3번 위치와 B의 9번 위치를 잇는 전깃줄, A의 4번 위치와 B의 1번 위치를 잇는 전깃줄을 없애면 남아있는 모든 전깃줄이 서로 교차하지 않게 된다.

전깃줄이 전봇대에 연결되는 위치는 전봇대 위에서부터 차례대로 번호가 매겨진다. 전깃줄의 개수와 전깃줄들이 두 전봇대에 연결되는 위치의 번호가 주어질 때, 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 위치의 번호가 차례로 주어진다. 위치의 번호는 500 이하의 자연수이고, 같은 위치에 두 개 이상의 전깃줄이 연결될 수 없다.

출력

첫째 줄에 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 출력한다.

예제 입력 1

8
1 8
3 9
2 2
4 1
6 4
10 10
9 7
7 6

예제 출력 1

3

풀이 방법

  • 그림 1과 같이 전깃줄이 배치되어 있을때, 최소로 전깃줄을 제거하는 방법은 a기준으로 정렬한 다음, b에서 LIS를 찾는 방법이다.
    • 그림 1의 경우, LIS를 찾아보면 2 4 6 7 10으로 총 길이가 5이므로, N에서 LIS길이를 뺀 3이 답이 된다.
    • 결국 b에 대한 LIS를 찾아내는 문제이므로, dp를 활용하면 되겠다.

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static PriorityQueue<Node> pq;
    static int[] wire;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        pq = new PriorityQueue<>((o1, o2) -> o1.a - o2.a);

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            pq.add(new Node(u, v));
        }

        wire = new int[N];

        for(int i = 0; i < N; i++){
            Node node = pq.poll();
            wire[i] = node.b;
        }

        int result = dp();

        System.out.println(N - result);
    }

    public static int dp(){
        int[] dp = new int[N];
        Arrays.fill(dp, 1);

        for(int i = 1; i < N; i++){
            for(int j = i - 1; j >= 0; j--){
                if(wire[i] > wire[j]){
                    dp[i] = Math.max(dp[j] + 1, dp[i]);
                }
            }
        }

        int max = 0;

        for(int i = 0; i < N; i++){
            max = Math.max(max, dp[i]);
        }

        return max;
    }

    public static class Node {
        int a;
        int b;

        public Node(int a, int b) {
            this.a = a;
            this.b = b;
        }
    }
}

결과

회고

  • 우선순위큐를 안써도 풀릴 수 있을 것 같은데... N이 100까지라 시간초과가 안났지만 뭔가 더 커지면 시간초과가 날 것 같았다.
저작자표시 비영리 동일조건 (새창열림)

'알고리즘' 카테고리의 다른 글

[백준] 알파벳 - Java  (2) 2025.05.15
[백준] 구간 합 구하기 4 - Java  (1) 2025.05.05
[백준] Puyo Puyo - Java  (1) 2025.05.01
[백준] 치킨 배달 - Java  (1) 2025.04.30
[백준] Contact - Java  (0) 2025.04.29
'알고리즘' 카테고리의 다른 글
  • [백준] 알파벳 - Java
  • [백준] 구간 합 구하기 4 - Java
  • [백준] Puyo Puyo - Java
  • [백준] 치킨 배달 - Java
BGK97
BGK97
사용자 입장에서 한번 더 생각하는 개발자로 성장하고 싶은 사람입니다.
  • BGK97
    꾸준히, 열심히
    BGK97
  • 전체
    오늘
    어제
    • 분류 전체보기 (111)
      • 알고리즘 (73)
      • 컴퓨터 구조와 운영 체제(책) (8)
      • 네트워크 (5)
      • React (10)
      • 경험한 에러들 (3)
      • HTML, CSS, JavaScript (8)
      • 자료구조 (1)
      • 이것이 컴퓨터 과학이다(책) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BGK97
[백준] 전깃줄 - Java
상단으로

티스토리툴바