////
Search
😵‍💫

가장 긴 증가하는 부분 수열

소스코드

이분탐색

import sys input = sys.stdin.readline N = int(input().strip()) A = list(map(int, input().strip().split())) def binary_search(list, target): start = 0 end = len(list) while start < end: mid = (start + end) // 2 if list[mid] < target: start = mid + 1 else: end = mid return start # 삽입할 인덱스 def solve(A): list = [] for value in A: index = binary_search(list, value) if index == len(list): list.append(value) else: list[index] = value return len(list) print(solve(A))
Python
복사

DP

import sys input = sys.stdin.readline N = int(input().strip()) A = list(map(int, input().strip().split())) lengths = [1] * N # DP 테이블 : A[i]를 마지막 원소로 하는 가장 긴 증가하는 부분 수열의 최대길이 for i in range(N): for j in range(i): if A[j] < A[i]: lengths[i] = max(lengths[i], lengths[j] + 1) print(max(lengths))
Python
복사

풀이

이분탐색

A의 원소를 리스트의 적절한 위치에 삽입해주면 됩니다.
이때 삽입할 위치를 찾기 위해 이분탐색을 사용합니다.
이분탐색을 거쳐 삽입할 위치의 인덱스를 찾아내고, 해당 인덱스의 값을 A의 원소로 만들어주면 됩니다. 물론 매번 이분탐색을 할 필요는 없고 부분수열의 마지막 값보다 크면 곧바로 삽입하면 됩니다(매번 이분탐색을 해도 됨)

DP

N의 사이즈는 최대 1000입니다. 이 말은, 1초 제한시간 동안에 이중반복문을 통해 O(N^2)의 시간복잡도를 가져도 시간초과가 되지 않는다는 소리입니다.
그러나 단순히 이중반복을 통해 제일 큰 값을 갱신해가며 카운트를 하면 안되더라구요 :
import sys input = sys.stdin.readline N = int(input().strip()) A = list(map(int, input().strip().split())) result = 0 # 가장 긴 증가하는 부분 수열의 길이 for i in range(N): num = A[i] temp_result = 1 for j in range(i+1, N): if num < A[j]: num = A[j] temp_result += 1 result = max(result, temp_result) print(result)
Python
복사
사실 아직 이 코드의 반례를 잘 모르겠습니다. 지피티한테 물어봐도 못 알려주네요. 그렇지만 어찌됐든 틀렸다고 나오는 코드입니다.