문제링크: www.acmicpc.net/problem/2565
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
지난번에 이어서 백준 단계별로 풀어보기 다이나미프로그래밍 문제다.
LIS라는 생각이 안떠오르면 어려울 것 같다.
나도 그리디로 접근하다가 생각보다 오래걸렸다. 어려운 구현 문제를 더 많이 풀어봐야겠다고 생각했다.
근데 N이 100이라 비효율적으로 짜더라도 풀릴 것 같긴 하다.
import java.io.*;
import java.util.*;
public class Main {
public static class Node implements Comparable<Node>{
int x;
int y;
@Override
public int compareTo(Node o) {
if (x>o.x) return 1;
else if(x==o.x) return 0;
return -1;
}
}
public static int N, lis[];
public static Node []node;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
node = new Node[N+1];
lis = new int[N+1];
for(int i=1;i<=N;i++){
st = new StringTokenizer(br.readLine());
node[i] = new Node();
node[i].x = Integer.parseInt(st.nextToken());
node[i].y = Integer.parseInt(st.nextToken());
}
node[0] = new Node();
node[0].x=-1; node[0].y=-1;
Arrays.sort(node);
for(int i=1;i<=N;i++) {
for(int j=0;j<i;j++) {
if(node[i].y > node[j].y) {
lis[i] = Math.max(lis[j]+1, lis[i]);
}
}
}
int ans = 0;
for(int i=1;i<=N;i++) {
ans = Math.max(ans, lis[i]);
}
System.out.println(N-ans);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1541 잃어버린 괄호 (0) | 2020.12.20 |
---|---|
[백준] 11054 가장 긴 바이토닉 부분 수열 (0) | 2020.12.08 |
[백준] 1003 피보나치 함수 (0) | 2020.12.07 |
[백준] 2042 구간 합 구하기 (2) | 2020.12.02 |
[백준] 1072 게임 (0) | 2020.12.01 |