sm 기술 블로그

138. 2565(전깃줄) 본문

문제/백준_자바

138. 2565(전깃줄)

sm_hope 2022. 7. 10. 20:31
import java.util.*;
import java.io.*;

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

		for (int i = 0; i < N; i++) {
			String[] tmp = br.readLine().split(" ");
			Eline[i][0] = Integer.parseInt(tmp[0]);
			Eline[i][1] = Integer.parseInt(tmp[1]);
			DP[i] = 1;
		}

		Arrays.sort(Eline, (e1, e2) -> {
			return e1[0] - e2[0];
		});

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

		Arrays.sort(DP);

		System.out.println(N - DP[DP.length - 1]);
	}
}

문제요약

서로 교차되지 않게 할때 제거 할 전깃줄 최소 개수

설명

LIS (최장증가수열) 를 이용하면 된다.

 

LIS로 나온 최대의 수가 서로 교차되지 않는 최대의 수라고 생각하면된다.

 

따라서 총 전깃줄 - 서로 교차되지 않는 최대의 를 해주면 제거해야할 최소의 전깃줄 개수가 나오게 된다.

 

이 문제는 정확하게 파악을 못하겠다..

따라서 비슷한 유형이 나오면 LIS를 사용해야겠다는 소스만 얻어가자.

'문제 > 백준_자바' 카테고리의 다른 글

140. 12865(평범한 배낭)  (0) 2022.07.11
139. 9251(LCS)  (0) 2022.07.10
137. 11054(가장 긴 바이토닉 부분 수열)  (0) 2022.07.10
136. 11053(가장 긴 증가하는 부분 수열)  (0) 2022.07.08
135. 2156(포도주 시식)  (0) 2022.07.08
Comments