Algorithm/DP

BOJ#2565 전깃줄

밤이2209 2017. 2. 20. 19:08

BOJ#2565 전깃줄


* 문제



* 풀이

문제 : 전깃줄이 교차하지 않기 위해 없애야 하는 전깃줄의 최소 개수를 구하시오.


문제에서 표시된 위 지문과 같이 전깃줄을 '제거'하는 관점에서 접근하게 되면 문제를 풀기 어려워지게 됩니다.


전깃줄을 하나씩 '제거'하면서 최소한 몇개를 제거해야 하는지 생각하는 것 보다,

전깃줄을 하나씩 '추가'하면서 최대한 몇개까지 겹치지 않고 추가할 수 있는지 생각해 봅시다.


* 전깃줄이 겹치지 않을 조건

 : A를 기준으로 정렬했을 때, B가 순차적으로 나열되어 있으면 된다.


주어진 입력을 A 기준으로 정렬해보면 LIS의 형태가 보인다.

(LIS : http://stack07142.tistory.com/56)


1 8 

2 2 

3 9 

4

6

7 6

9 7 

10 10 


LIS는 [2 4 6 7 10] 또는 [1 4 6 7 10]으로 길이가 5이다. 따라서 8 - 5 = 3.

즉 최소 3개를 제거하면 전깃줄이 교차하지 않게 된다.





* 나의 코드

https://github.com/stack07142/BOJ/tree/master/BOJ%232565_ElectricWire/src


import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
* BOJ#2565 전깃줄
* https://www.acmicpc.net/problem/2565
*/

public class Main {

public static void main(String[] args) throws IOException {

int N; // 전깃줄의 갯수
Wire[] list;

// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

list = new Wire[N];

for (int i = 0; i < N; i++) {

StringTokenizer st = new StringTokenizer(br.readLine().trim());

list[i] = new Wire(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}

// solve
Arrays.sort(list);

int[] tailTable = new int[N];
int length;

// 초기값
tailTable[0] = list[0].b;
length = 1;

for (int i = 1; i < N; i++) {

int candidate = list[i].b;

if (candidate < tailTable[0]) {

tailTable[0] = candidate;
} else if (candidate > tailTable[length - 1]) {

tailTable[length++] = candidate;
} else {

int idx = Arrays.binarySearch(tailTable, 0, length, candidate);
idx = idx < 0 ? -idx - 1 : idx;

tailTable[idx] = candidate;
}
}

bw.write(String.valueOf(N - length));
bw.flush();

bw.close();
br.close();
}
}

class Wire implements Comparable<Wire> {

int a;
int b;

Wire(int a, int b) {

this.a = a;
this.b = b;
}

@Override
public int compareTo(Wire o) {

return this.a < o.a ? -1 : 1;
}
}






'Algorithm > DP' 카테고리의 다른 글

BOJ#2196 로봇 조종하기  (1) 2017.03.17
BOJ#2532 먹이사슬 (Chain)  (0) 2017.02.21
BOJ#1932 숫자삼각형  (0) 2017.02.09
BOJ#1149 RGB거리  (0) 2017.02.08
BOJ#9251 LCS  (0) 2017.02.06