알고리즘(백준)/동적 계획법

[알고리즘/DP] 2565번 : 전깃줄 - python

되다 2024. 2. 16. 16:53

링크 : https://www.acmicpc.net/problem/2565

 

2565번: 전깃줄

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는

www.acmicpc.net

 


  • 문제
  • 소요시간:25분 실패


  • 설계하기(접근방법) 

1. 입력받기

전깃줄 리스트를 입력받는다

 

2. 구현하기

현재 왼쪽 전깃줄을 기준으로 그 전 전깃줄 중

최대값을 가져오면 될 것 같았는데

어떻게 우측 값을 조절해야하는지

떠올리질 못했다

 

현재 전깃줄을 기준으로

첫 전깃줄 부터 최대값을 비교한다

그 중 현재 전깃줄의 우측 값보다

작은 값들로만 비교한다

 

우측 값이 현재보다 작다면

비교하는 전깃줄의 dp(이전 전깃줄)는

항상 비교하는 전깃줄의 우측값보다

작을 것이기 때문에 최적의 해를 보장할 수 있다.

 

그 중 가장 최대인 값 + 1을 해준다

 

3. 출력하기

전깃줄의 총 개수에서 최대값을 빼주어

즉 삭제해야하는 전깃줄의 개수를 출력한다

 


  • 코드(출력)
n = int(input())

elec = []

dp = [1] * (n)

for _ in range(n):
    start, end = map(int, input().split())
    elec.append([start, end])

elec.sort(key = lambda x : x[0])

for i in range(n):
    for j in range(i):
        if elec[i][1] > elec[j][1]:
            dp[i] = max(dp[j] + 1, dp[i])


print(n - max(dp))

  • 얻어갈 부분

1. 실패했지만 이해하려고 끝가지 노력했다.