
출처 :
https://www.acmicpc.net/problem/2565
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
풀이 :
n = int(input())
line = []
for _ in range(n):
line.append(list(map(int,input().split())))
line.sort()
dp = [1 for i in range(n)]
for i in range(n):
for j in range(i):
if line[i][1] > line[j][1]:
dp[i] = max(dp[i], dp[j]+1)
print(n-max(dp))
LIS(부분 증가 수열)을 이용하면 쉽게 해결 할 수 있는 문제이다.
LIS를 이해하니 왜 이 문제가 정답율이 높은지 알 것같다.
문제에서 요구하는 것을 살펴보면 전깃줄이 겹치지 않게 빼줘야한다. 그러기 위해선 전봇대 A를 기준으로 오름차순으로 나열한 후에 B를 LIS로 정렬 하면 된다.
1 8 과 2 2 는 만난다.. 왜냐하면 B가 8과 2여서 (8>2) .
2 2 와 3 9 는 만나지 않는다. 왜냐하면 (2<9) 이기 떄문이다.
따라서 A의 맞게 정렬을 해준뒤 B에 대해 LIS 정렬을 해주면 dp = 1 1 2 1 2 3 4 5 를 구할 수 있다.
여기서 5가 최대로 남을 수 있는 전깃줄에 개수이므로 전체 개수 n - max(dp) 를 해준다.
'코딩테스트' 카테고리의 다른 글
프로그래머스 Lv1 모의고사 - Python (0) | 2022.03.22 |
---|---|
백준 12865 평범한 배낭 - Python (0) | 2022.03.16 |
백준 11054 가장 긴 바이토닉 부분수열 - Python (0) | 2022.03.12 |
백준 10844 쉬운 계단 수 - python (0) | 2022.03.06 |
백준 1463 1로 만들기 - Python (0) | 2022.03.04 |