알고리즘||코딩테스트/백준

[백준 1365번] 꼬인 전깃줄 - Python

째로스 2023. 7. 8. 18:50

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

 

1365번: 꼬인 전깃줄

첫 줄에 전봇대의 개수 N(1 ≤ N ≤ 100,000)이 주어지고, 이어서 N보다 작거나 같은 자연수가 N개 주어진다. i번째 줄에 입력되는 자연수는 길 왼쪽에 i번째 전봇대와 연결된 길 오른편의 전봇대가

www.acmicpc.net

 

풀이

사용한 알고리즘 : 이진 탐색, LIS(Longest Increasing Subsequence)

 

풀이 전략

1. 첫 번째 입력한 수를 비어있는 result 리스트에 추가한다.

2. i 번째 입력한 수가 result의 맨 끝값보다 크면 result 리스트에 추가한다.

3. i 번째 입력한 수가 result의 맨 끝값보다 작으면 result 내부를 이진탐색하여,

   해당 수보다 크거나 같은 제일 작은 수를 i번째 입력한 수로 교체한다.(Lower bound 사용)

4. 전봇대 개수(n) - result 리스트가 가진 수의 개수(len(result)) 를 출력한다.

 

아래는 N=8, arr = [ 2, 6, 8, 9, 3, 4, 5, 7 ] 의 입력이 주어졌을 경우의 예시이다.

 따라서 answer = n - len(result) = 8 - 5 = 3

 

제출 코드

import bisect
import sys

input = sys.stdin.readline

n=int(input())

arr=list(map(int,input().split()))
result=[arr[0]]

for i in range(1,n):
    if result[-1]<arr[i]:
        result.append(arr[i])
    else:
        result[bisect.bisect_left(result,arr[i])]=arr[i]

print(n-len(result))