흙금이네 블로그

[BOJ] 2568 - 전깃줄 - 2 (Python) 본문

알고리즘

[BOJ] 2568 - 전깃줄 - 2 (Python)

흙금 2023. 3. 24. 14:31

 

 

아이디어

 

A전봇대 위치 번호를 기준으로 전깃줄을 내림차순 정렬 후 B전봇대 위치 번호의 최장 감소 수열을 구한다.

이후 최장 감소 수열에 포함되지 않은 전깃줄의 A전봇대 위치 번호를 출력한다.

 

 

풀이

 

import sys

input = sys.stdin.readline

def solution():
    N = int(input())
    lines = sorted([tuple(map(int, input().split())) for _ in range(N)], reverse=True)
    LDS = [lines[0][1]]
    idx_list = [0]*N
    cnt = 1
    for i in range(1, N):
        if lines[i][1] < LDS[-1]:
            LDS.append(lines[i][1])
            idx_list[i] = cnt
            cnt += 1
        else:
            s = 0
            e = cnt-1
            while s <= e:
                m = (s+e)//2
                if LDS[m] > lines[i][1]:
                    s = m+1
                elif LDS[m] < lines[i][1]:
                    e = m-1
                else:
                    LDS[m] = lines[i][1]
                    idx_list[i] = m
                    break
            else:
                LDS[s] = lines[i][1]
                idx_list[i] = s
    res = []
    idx = cnt-1
    for i in range(N-1, -1, -1):
        if idx_list[i] == idx:
            idx -= 1
        else:
            res.append(f'{lines[i][0]}')
    print(N-cnt)
    print('\n'.join(res))

solution()

 

Comments