문제 링크
14002번: 가장 긴 증가하는 부분 수열 4
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
문제 풀이
- 최대 길이를 구하려면 현재 위치의 값에서 앞에 작은 값들이 얼마나 있는지를 계산하면 된다.
- 수열 10, 20, 10, 30, 20, 50이 있다고 가정한다.
- 첫 번째 위치인 10은 자신 하나므로 최대 길이가 1이 되고, 두 번째 위치인 20은 자신과 그 앞의 숫자로 최대 길이가 2가 된다.
- 세 번째 위치인 10은 앞의 두 숫자가 모두 작지 않으므로 최대 길이가 1이 된다.
- 이를 점화식으로 표현하면 arr[j] < arr[i] (j < i), dp[i] = max(dp[i], dp[j] + 1) 가 된다.
- 점화식을 통해서 구한 dp 배열의 최댓값이 최대 길이가 된다.
- 최대 길이가 될 때의 수열을 구하기 위해서는 dp 배열 맨 뒤에서 큰 값부터 찾아야 한다. (앞에서 부터 작은 값을 찾는 경우의 반례: 999, 1000, 1, 2, 3)
- 수열을 구한 후 이를 뒤집어서 출력해야 한다.
전체 코드
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
dp = [1] * n
for i in range(n):
for j in range(i):
if arr[j] < arr[i]:
dp[i] = max(dp[i], dp[j] + 1)
res = []
k = max(dp)
for i in range(n-1, -1, -1):
if dp[i] == k:
if k == max(dp):
res.append(arr[i])
else:
if arr[i] < res[-1]:
res.append(arr[i])
k -= 1
print(max(dp))
print(" ".join(map(str, res[::-1])))
반응형
'Coding Test > BOJ' 카테고리의 다른 글
[백준/Python] 2631 줄 세우기 (0) | 2024.04.11 |
---|---|
[백준/Python] 14719 빗물 (0) | 2024.04.09 |
[백준/Python] 14891 톱니바퀴 (0) | 2024.04.03 |
[백준/Python] 14502 연구소 (0) | 2024.03.28 |
[백준/Python] 19539 사과나무 (0) | 2024.03.22 |