From e5f5c64f26a7cc452c2b8c3da648bc2777600baa Mon Sep 17 00:00:00 2001 From: nkey Date: Mon, 16 Mar 2026 17:41:09 +0900 Subject: [PATCH] =?UTF-8?q?2631-g4=20=ED=92=80=EC=9D=B4=20=EB=B3=B4?= =?UTF-8?q?=EA=B3=A0=20=ED=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_8708/gold/2631-g4.py | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 workbook_8708/gold/2631-g4.py diff --git a/workbook_8708/gold/2631-g4.py b/workbook_8708/gold/2631-g4.py new file mode 100644 index 0000000..31d66eb --- /dev/null +++ b/workbook_8708/gold/2631-g4.py @@ -0,0 +1,55 @@ +# 줄세우기 + +import sys + +input = sys.stdin.readline + +def binary_search(v, tails): + l, r = 0, len(tails) + while l < r: + mid = (l+r)//2 + if tails[mid] >= v: + r = mid + else: + l = mid + 1 + + return l + +def solution(): + n = int(input().rstrip()) + + tails = [int(input().rstrip())] + for _ in range(n-1): + now = int(input().rstrip()) + if tails[-1] < now: + tails.append(now) + elif tails[-1] == now: + continue + else: + idx = binary_search(now, tails) + tails[idx] = now + + print(n - len(tails)) + + return + + +solution() + +""" +걸린 시간: 몰라 + +시간 복잡도: + +해설: 최대 길이의 이미 정렬되어 있는 애들을 제외한 애들을 움직이면 된다. -> LIS(가장 긴 증가하는 부분 수열) +두 가지 방법이 있는데, +1) dp[i]는 i번째가 맨 끝인 증가하는 부분 수열의 길이라고 할 때, 이중 for문으로 dp[i]를 볼때 j O(n^2) +2) tails[i]는 i+1 길이의 증가하는 부분 수열들 중에 맨 끝값 중 최소값이라고 할 때(2 5 8, 2 4 6이 있으면 tails[2]=6), +지금 보는 값이 tails[-1]보다 크다면 tails.append()로 최장 증가 부분 수열의 고점을 높이고, +지금 보는 값이 tails[-1]보다 같다면 그냥 넘어가고, +지금 보는 값이 tails[-1]보다 작다면 tails의 어디에 들어갈지 이분탐색으로 확인해서, +그 인덱스의 값을 교체함으로써 tails[idx]에 최대한 작은 수를 놓고 앞으로의 가능성을 높인다.(tails=[2, 5, 8] 이때 4가 들어오면 tails=[2, 4, 8]) +이렇게 하면 최장 증가 부분 수열의 길이를 O(nlogn)에 구할 수 있지만, 실제 수열은 모른다. -> 따로 기록해두어야 함. + +""" \ No newline at end of file