문제 풀이 날짜: 2023.05.13
포스트 작성일: 2023.05.23
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
백준 온라인 저지 2565번: 전깃줄 (골드5) (문제 링크)
키워드
동적 계획법(DP), Comparator
풀이 접근법
- 전깃줄의 교차 여부는 전깃줄이 연결되어 있는 지점의 번호로 식별할 수 있다.
- 전깃줄 ⓐ가 4-1 로 연결되어 있는데, 전깃줄 ⓑ는 2-2 로 연결되어 있다면 교차하는 것이다.
- (전깃줄 ⓑ의 연결 번호 - 전깃줄 ⓐ의 연결 번호) 를 왼쪽 & 오른쪽별로 구했을 때 왼쪽 & 오른쪽 중 한 곳이라도 음수라면(0은 나올 수 없음) 두 전깃줄이 교차된 것이다.
- 문제에서는 설치된 전깃줄 N개의 정보를 준다. 그렇다면 전봇대에 아무 것도 설치되지 않은 상태에서 이 전깃줄 N개 중 몇 개를 교차되지 않게 설치할 수 있을지를 찾아야 한다.
- DP 배열에 교차되지 않게 몇 개까지 설치할 수 있을지를 담는다.
- 이렇게 (전체 N개 - 설치 가능한 개수)를 계산하면 그 결과가 철거해야 할 개수가 된다.
- 교차되지 않게 설치하는 방법은 위에 적어두었던 ‘번호의 차’를 이용하면 된다. 번호의 차라고 해봤자 이 번호들이 정렬된 상태(Comparator 구현 필요)에서 A와 B가 동시에 오름차순으로 증가하는지만(LIS) 체크하면 교차 여부를 알 수 있다.
- 쉽게 말해서, A와 B 배열을 가지고 동시에 LIS를 찾으면 된다.
코드
import java.io.*;
import java.util.*;
public class Q2565 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
LinkedList<int[]> poles = new LinkedList<>();
for(int i = 0; i < N; i++) {
String[] temp = br.readLine().split(" ");
int A = Integer.parseInt(temp[0]);
int B = Integer.parseInt(temp[1]);
int[] result = {A, B};
poles.add(result);
}
Collections.sort(poles, (o1, o2) -> Integer.compare(o1[0], o2[0]));
int max = Integer.MIN_VALUE;
int[] DP = new int[N];
Arrays.fill(DP, 1);
for(int i = 1; i < N; i++) {
int[] now = poles.get(i);
for(int j = 0; j < i; j++) {
int[] prev = poles.get(j);
if(prev[0] < now[0] && prev[1] < now[1]) {
DP[i] = Math.max(DP[j] + 1, DP[i]);
}
}
max = Math.max(DP[i], max);
}
System.out.print(N - max);
}
}
처음에는 철거해야 할 전깃줄을 찾다가 점화식도 세우지 못하고 갈피를 잡지 못하였다. 전깃줄을 하나씩 제거하면서 (100) 남은 전깃줄(500 * 500) 중에서 교차하는 것을 찾으면(500) 시간초과이기 때문이다. 30분정도 고민하다가, 다른 분들의 풀이를 참고하여 내 방식대로 코드를 작성해보았다.
git 링크
https://github.com/jinju9553/23-CodingTest/blob/main/week8/day1/Q2565.java
참고한 블로그 링크
https://st-lab.tistory.com/138
'Study > Problem Solving' 카테고리의 다른 글
[백준 / Java] 1874번: 스택 수열 (실버2) (0) | 2023.05.25 |
---|---|
[백준 / Java] 4949번: 균형잡힌 세상 (실버4) (0) | 2023.05.24 |
[백준 / Java] 1541번: 잃어버린 괄호 (실버2) (0) | 2023.05.23 |
[프로그래머스 / Java] 이중우선순위큐 (Lv.3) (1) | 2023.05.21 |
[SWEA / Java] 1244번: 최대상금 (D3) (0) | 2023.05.21 |