백준[파이썬]

[백준/Python] - 2565 전깃줄

코린이 파닥거리기 2025. 5. 12. 22:20
728x90
반응형
SMALL

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

 

 

제출코드

N = int(input())
N_list = []
dp = [0] * (N)
for _ in range(N):
    a, b = map(int, input().split())
    N_list.append([a,b])
N_list = sorted(N_list, key=lambda x:x[0])
for i in range(len(N_list)):
    for j in range(i):
        if N_list[i][1] > N_list[j][1]:
            dp[i] = max(dp[i], dp[j]+1)
print(dp)
print(N - (max(dp)+1))

 

일단 뭐 어떻게 접근하는지도 몰라서 찾아보면서 풀었다.(LIS응용 문제라고 한다.)

풀면서 생각을 해보니 LIS가 맞는거 같기도 하고 ㅎㅎ...

 

핵심 접근법은

일단 N_list에 [a,b]형식으로 a와 b를 매핑시켜준다.

sorted함수를 사용해서 매핑시킨 [a,b]배열을 x[0]즉 a를 기준으로 오름차순 정렬을 해주는데 

여기서 2중 for문으로

i번째의 값(현재 전봇대)과 j번째 값(i번째 전까지의 모든 전봇대)(i-1)까지 비교를 하는데 

i번째 값이 j번째 값보다 크면 → 교차하지 않는 부분수열의 일부가 된다는 소리이다.

해당 조건문이 통과되면 N_list[i]가 교차하지 않는 부분수열의 일부가 될 수 있다는 소리이므로 

N_list[i] 앞에 올 수 있는 모든 이전 유효한 수열(N_list[j])중 가장 긴 교차하지 않는 전봇대에 자기자신(N_list[i])를 추가하여 저장한다.


도움이 될지는 모르겠지만 그림도 하나 투척하고 간다ㅎㅎ...

 


DP는 너무 어렵다

하지만 공부를 하다가 지칠때는 궤도님처럼 마인드 컨트롤을 해보자

 

728x90
반응형
LIST