본문 바로가기
Coding Test

[DP, LIS] 2565 - 전기줄

by kldaji 2021. 7. 14.

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

 

2565번: 전깃줄

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

www.acmicpc.net

 

1. 코드

from sys import *

# INPUT
N = int(stdin.readline().rstrip())
BUILDING = []
for _ in range(N):
    BUILDING.append(list(map(int, stdin.readline().rstrip().split())))

# A를 기준으로 정렬
BUILDING.sort()

# B에 대해서 LIS(Longest Increasing Subsequence)를 구한다.

dp = [0] * (N + 1)
dp[1] = 1

for i in range(2, N + 1):
    for j in range(1, i):
        if BUILDING[i - 1][1] > BUILDING[j - 1][1] and dp[i] < dp[j]:
            # 현재 값보다 작은 값이 있고, dp값이 더 크다면 update를 해준다.
            dp[i] = dp[j]
    # 자기 자신을 포함해야하므로 항상 +1을 해준다.
    dp[i] += 1

print(N - max(dp))

 

※ LIS 문제라는 것을 파악해야하는 쉽지 않은 문제였다. 새로운 문제에 대해서 풀이 방법을 스스로 생각해내는 연습이 필요하다...

'Coding Test' 카테고리의 다른 글

[String, Hash] 4358 : 생태학  (0) 2021.07.15
[DP] 2225: 합분해  (0) 2021.07.15
[Implementation, BFS] 13460: 구슬 탈출 2  (0) 2021.07.12
[Math] 피보나치  (0) 2021.07.09
[Math, Divide & Conquer] 1629: 곱셈  (0) 2021.07.08