https://www.acmicpc.net/problem/2565
1. 아이디어
다이나믹 프로그래밍 중 LIS 알고리즘으로 해결할 수 있다.
2. 문제풀이
전깃줄을 A 전봇대를 기준으로 위에서부터 번호를 매겼을 때 전깃줄이 교차하지 않는 상태는 전깃줄의 순서가 커질수록 B 전봇대에서의 위치가 같이 커져야 한다. 이를 활용해 A 전봇대 위치를 기준으로 정렬한 후 B 전봇대에서의 위치에 대한 LIS를 구하면 이 값이 서로 교차되지 않고 연결될 수 있는 최대 전깃줄의 수이다.문제는 없애야할 전깃줄의 최소 개수를 구해야하므로 처음 주어진 전깃줄의 수에서 LIS의 크기를 뻬주면 된다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[][] map = new int[N][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
map[i][0] = Integer.parseInt(st.nextToken());
map[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(map, ((o1, o2) -> Integer.compare(o1[0], o2[0])));
int[] dp = new int[N];
Arrays.fill(dp, 1);
int min = N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < i; j++) {
if (map[j][1] < map[i][1]) dp[i] = Math.max(dp[i], dp[j] + 1);
}
min = Math.min(min, N - dp[i]);
}
System.out.println(min);
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 8958번 - OX퀴즈 [Java] (0) | 2025.01.06 |
---|---|
[백준] 2163번 - 초콜릿 자르기 [Java] (0) | 2025.01.06 |
[백준] 2446번 - 별 찍기 - 9 [Java] (0) | 2025.01.05 |
[백준] 2445번 - 별 찍기 - 8 [Java] (0) | 2025.01.05 |
[백준] 2444번 - 별 찍기 - 7 [Java] (0) | 2025.01.05 |