백준 2565 - 전깃줄 (Python3)
코드
n = int(input())
cable = []
# 전깃줄 연결 상태 입력
for _ in range(n):
cable.append(list(map(int, input().split())))
# 첫번째 요소를 기준으로 cable 정렬
# 이차원 배열을 sort() 시키면 첫번째 요소로 정렬됨
cable.sort()
# 두번째 전봇대에 연결된 전깃줄 위치만 따로 입력받을 리스트
second_pole = []
for i in range(n):
second_pole.append(cable[i][1])
# DP 테이블
d = [1 for _ in range(n)]
# LIS 메소드
def lis(pole, d):
for i in range(1, n):
for j in range(i):
if pole[j] < pole[i]:
d[i] = max(d[i], d[j] + 1)
return d
lis(second_pole, d)
# LIS의 값만큼 전깃줄 개수에서 뺴주면 정답
print(n - max(d))
문제 해설
LIS의 응용 문제.
코드 구현 자체는 그리 어렵지 않으나, 문제를 푸는 힌트를 얻는게 어려운 문제이다.
일단 입력받은 전깃줄 연결 상태를 하나의 전봇대를 기준으로 오름차순 정렬을 한 후, 나머지 한 전봇대의 연결 상태의 LIS를 구해줘서 나오는 값이 교차되지 않게 전깃줄을 설치할 수 있는 최대 개수가 된다. 문제에서는 교차되지 않게 만들기 위해 제거해야 하는 최소 개수를 구하라고 하였으므로, 입력받은 전깃줄의 개수 n에 LIS로 구한 값을 빼주면 정답으로 인정된다.
댓글남기기