알고리즘/BOJ
[BOJ] 2565. 전깃줄
재담
2022. 3. 11. 01:15
문제 원본 : https://www.acmicpc.net/problem/2565
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
Line[] lines = new Line[n];
int[] dp = new int[n];
StringTokenizer st = null;
for (int i = 0; i < n; ++i) {
st = new StringTokenizer(br.readLine());
lines[i] = new Line(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
Arrays.sort(lines);
int max = 0;
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (lines[i].b > lines[j].b) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
max = Math.max(max, dp[i]);
}
bw.write(String.valueOf(n - max));
bw.close();
br.close();
}
public static class Line implements Comparable<Line> {
public int a;
public int b;
public Line(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public int compareTo(Line o) {
return a - o.a;
}
}
}
- LIS 문제
- A나 B 둘 중 아무거나 기준을 잡고 정렬을 한 뒤 반대편에서 가장 긴 증가하는 부분 수열을 구하면 된다.
- 그 수열의 길이가 전깃줄을 교차하지 않게 만들 수 있는 최대 길이이므로
- 총 전깃줄 수에서 수열의 길이를 빼면 된다.