공부 기록장
[백준 - Python] 2565. 전깃줄 본문
https://www.acmicpc.net/problem/2565
코드
N = int(input())
dp = [1] * N
lines = sorted([list(map(int, input().split())) for _ in range(N)], key = lambda x : x[0])
for i in range(N):
for j in range(i):
if lines[i][1] > lines[j][1]:
dp[i] = max(dp[i], dp[j] + 1)
print(N - max(dp))
대표적인 LIS(Longest Increasing Subsequence) 최장 증가 부분 수열 알고리즘 문제로 볼 수 있다.
해당 알고리즘은 DP를 활용해서 구현할 수 있다.
1로 초기화 된 DP 리스트를 선언해준다.
해당 dp[i]에는 i번째 선의 위치까지 최대 몇 개의 전깃줄이 얽히지 않는지를 저장해 준다.
전봇대 A와의 연결 위치를 기준으로 오름차순 정렬을 해주었다.
각 전깃줄을 돌면서, 현재 돌고 있는 전깃줄보다 시작점이 작은 전깃줄들을 확인하면서
끝 점이 현재 돌고 있는 전깃줄의 끝 점보다 작은 경우에
즉, 전깃줄이 교차하지 않는 경우에 dp[j]의 카운팅을 1 늘려준 값과 현재 위치의 dp[i] 값 중 최댓값으로
dp[i]를 갱신해준다.
잘라야 하는 전깃줄의 최소 개수를 구해야 함으로
전체 전깃줄 갯수에서 dp리스트의 최댓값을 빼주면 답이 된다.
'코딩 테스트 > 백준 문제 풀이' 카테고리의 다른 글
[백준 - Python] 1806. 부분합 (0) | 2024.08.08 |
---|---|
[백준 - Python] 11728. 배열 합치기 (0) | 2024.08.05 |
[백준 - Python] 9465. 스티커 (0) | 2024.03.28 |
[백준 - Python] 10844. 쉬운 계단 수 (0) | 2024.03.28 |
[백준 - Python] 1654. 랜선 자르기 (0) | 2024.02.23 |