https://www.acmicpc.net/problem/2568
import sys
from bisect import bisect_left
input=sys.stdin.readline
N=int(input())
arr=[]
allNum=set()
for _ in range(N):
a,b=map(int,input().split())
arr.append((a,b))
allNum.add((a,b))
arr.sort()
tails=[]
tails_idx=[]
prev_idx=[-1]*N
for i in range(N):
num=arr[i][1]
pos=bisect_left(tails,num)
if pos==len(tails):
tails.append(num)
tails_idx.append(i)
else:
tails[pos]=num
tails_idx[pos]=i
if pos>0:
prev_idx[i]=tails_idx[pos-1]
print(N-len(tails))
k=tails_idx[-1] if tails_idx else -1
while k!=-1:
allNum.remove(arr[k])
k=prev_idx[k]
for t in sorted(allNum):
print(t[0])
기존 전깃줄 문제의 알고리즘에서 이진탐색을 활용한 LIS로 바꾸면 되는 문제이다. 이진탐색을 활용한 LIS의 경우 이전 idx를 저장해서 최장 수열이 무엇인지 추적이 가능하므로 이를 활용하면 된다.
이렇게 Python로 백준의 "전깃줄 - 2" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊