1 λΆ„ μ†Œμš”

πŸ“ [G5_2565] 전깃쀄

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

public class Main {
    static int[] dp;
    static int[][] wire;

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

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

        dp = new int[N];
        wire = new int[N][N];

        for(int i=0; i<N; i++){
            st = new StringTokenizer(br.readLine()," ");
            wire[i][0] = Integer.parseInt(st.nextToken());
            wire[i][1] = Integer.parseInt(st.nextToken());
        }

        // μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
        Arrays.sort(wire, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }
        });

        // 풀이 방법
        // μ—°κ²°ν•  수 μžˆλŠ” μ΅œλŒ€ μ „μ„  개수λ₯Ό κ΅¬ν•΄μ„œ 총 μ „μ„  κ°œμˆ˜μ—μ„œ λΉΌμ£Όλ©΄ μ΅œμ†Œ μ „μ„  μ‚­μ œ 수λ₯Ό ꡬ할 수 μžˆλ‹€.


        // μ΅œλŒ“κ°’ ( μ—°κ²°κ°€λŠ₯ν•œ )
        int max = 0;

        // i번째 Aμ „λ΄‡λŒ€λ₯Ό κ°œμ€€μœΌλ‘œ μ—°κ²°κ°€λŠ₯ν•œ 개수 탐색, μ΅œλŒ“κ°’ μ°ΎκΈ°
        for(int i=0; i<N; i++){
            max = Math.max(max, recur(i));
        }

        // 전체 μ „μ„  개수 - μ΅œλŒ“κ°’ = μ΅œμ†Œλ‘œ μ—†μ• λŠ” μ „μ„  수
        System.out.println(N - max);

    }

    static int recur(int N) {
        // 처음 νƒμƒ‰ν•˜λŠ” μ „λ΄‡λŒ€λΌλ©΄
        if(dp[N] == 0){

            // μ΅œμ†Ÿκ°’μ„ 1둜 μ΄ˆκΈ°ν™”
            dp[N] = 1;

            // A의 Nλ²ˆμ§Έμ™€ μ΄ν›„μ˜ μ „λ΄‡λŒ€λ“€ 비ꡐ
            for(int i=N+1; i<dp.length;i++){
                // λ§Œμ•½ μ—°κ²°ν•  수 있으면
                if(wire[N][1] < wire[i][1]){
                    // dp 배열에 더 큰 값을 μ €μž₯ν•΄μ€€λ‹€.
                    // A μ „λ΄‡λŒ€μ˜ N번째 전선이 μ—°κ²°λ˜μ–΄μžˆλŠ” Bμ „λ΄‡λŒ€λ³΄λ‹€
                    // A의 i번째 μ „λ΄‡λŒ€μ˜ 전선이 이어진 Bμ „λ΄‡λŒ€κ°€ λ’€μ—μžˆμ„ 경우
                    // 전선을 μ„€μΉ˜ν•  수 μžˆλ‹€.
                    dp[N] = Math.max(dp[N], recur(i) + 1);
                }
            }
        }
        return dp[N];
    }
}

πŸ€” λ‚˜μ˜ 생각

λ°˜λ‘€λ₯Ό λ‹€ λ„£μ—ˆμ§€λ§Œ ν†΅κ³Όν•΄μ„œ λŒ€μ²΄ 뭐가 문젠지 μ•Œμ•„λ³΄λ‹€ ν‹€λ¦° 것을 깨달은 λ¬Έμ œμ΄λ‹€..
λ¨Όμ € 처음 μƒκ°ν•œ 방법은

  1. μ‹œμž‘ μ’Œν‘œλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
  2. 각 μ’Œν‘œλ§ˆλ‹€ κ²ΉμΉ˜λŠ” μ„ μ˜ 개수λ₯Ό κ΅¬ν•œλ‹€.
  3. μ΅œλŒ€ 개수인 선을 μ‚­μ œν•΄ κ°€λ©° 전체 κ²ΉμΉ˜λŠ” μ„ μ˜ κ°œμˆ˜κ°€ 0일 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
  4. λ°˜λ³΅ν•˜λŠ” 횟수λ₯Ό μΉ΄μš΄νŒ…ν•΄μ„œ 좜λ ₯ν•΄μ€€λ‹€.


이 λ°©λ²•μ—μ„œ κ°€μž₯ 큰 잘λͺ»μ€ μ΅œλŒ€λ‘œ κ²ΉμΉ˜λŠ” 선이 μ—¬λŸ¬κ°œ λ‚˜μ˜¬λ•Œ 무엇을 μ‚­μ œν•˜λƒμ— 따라 μ΅œμ’… 값이 λ‹¬λΌμ§„λ‹€λŠ” 점이닀.
근데 .. λ§Žμ€ 질문 μ†μ˜ λ°˜λ‘€λ₯Ό ν•΄λ΄€λŠ”λ° λ‚˜λŠ” μ œλŒ€λ‘œ λ‚˜μ™€μ„œ.. λ§žμ€ 쀄 μ•Œμ•˜λŠ”λ° 방법 μžμ²΄κ°€ ν‹€λ¦° κ²ƒμ΄μ˜€λ‹€..

κ·Έλž˜μ„œ μ°Ύμ•„λ³Έ κ²°κ³Ό 방법은 dpλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀..
μ•½κ°„ μ ‘κ·Ό 방법이 λ‹€λ₯Έ 것이 μ‚­μ œν•  전선을 μ°ΎλŠ” 것이 μ•„λ‹Œ μ΅œλŒ€λ‘œ μ—°κ²°ν•  수 μžˆλŠ” 전선을 μ°Ύμ•„ 총 μ „μ„ μ—μ„œ λΉΌλŠ” 것이닀.
κ·Έλž˜μ„œ λ©”λͺ¨λ¦¬μ œμ΄μ…˜μ„ μ΄μš©ν•΄ μ—°κ²°ν•  수 μžˆλŠ” μ΅œλŒ€ 전선을 ꡬ해 총 μ „μ„ μ—μ„œ λΉΌμ£Όλ©΄ λœλ‹€.
μ—­μ‹œ.. dpλŠ” μ²˜μŒμ— 접근을 λͺ»ν•˜λ©΄β€¦ μ–΄λ ΅λ‹€.. γ…Ž