<문제>
링크 : https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
<코드>
import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
count = [1] * N
for i in range(1, N):
_list = []
for j in range(i):
if A[i] > A[j]:
_list.append(j)
if len(_list) ==0:
count[i] = 1
else:
_x = count[_list[0]]
for _i in range(len(_list)):
index = _list[_i]
_x = max(count[index], _x)
count[i] = _x+1
M = max(count[i] for i in range(N))
print(M)
<풀이>
한번에 입력된 배열에 대해 가장 긴 증가하는 수열을 찾을 수 없다.
배열의 앞에서 부터 오른쪽으로 이동하면서 가장 긴 수열의 길이를 저장하여 배열의 부분 최적해를 통해 전체 문제의 최적해를 구해야 한다.
index를 1씩 증가시키면서 해당 index 앞의 가장 긴 수열의 길이에 +1을 해주도록 한다.
예를 들어, index가 4일때 앞선 배열의 원소가 index가 4인 배열의 원소보다 작고 그 원소까지 계산한 배열이 가장 긴 원소를 선정한다. 그 원소가 가진 배열의 길이 +1을 해준 값이 index가 4인 원소에서의 가장 긴 증가하는 수열의 길이가 된다.
참고 : https://github.com/Junuux/Algorithm/tree/main/Silver/11053
GitHub - Junuux/Algorithm
Contribute to Junuux/Algorithm development by creating an account on GitHub.
github.com
'Algorithm' 카테고리의 다른 글
백준 1012번 : 유기농 배추 (0) | 2022.01.16 |
---|---|
백준 1912번 : 연속합 (0) | 2022.01.08 |
백준 9095번 : 1, 2, 3 더하기 (0) | 2022.01.05 |
백준 20300번 : 서강근육맨 (0) | 2022.01.05 |
백준 20115번 : 에너지 드링크 (0) | 2022.01.05 |