코딩문제풀이/Baekjoon

[Python_DynamicProgramming] 백준 11053번 : 가장 긴 증가하는 부분 수열

코딩하는 포메라니안 2021. 8. 13. 15:50

1. 문제

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

 

 

 

2. 풀이 과정

방법 1) 자신의 앞에 있는 값들 중 자신과 작으면서 길이가 최대인 값에 1을 더한 값이 자신이 최대가 될 수 있는 값이다.

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

for i in range(1, n):
  max_v = 0
  #자신보다 작은 값들 중 길이가 최대인 값 고르기
  for j in range(i):
    if arr[j] < arr[i]:
      max_v = max(max_v, result[j])
  result[i] = max_v + 1

print(max(result))

 

방법 2) 들어오는 값을 결과 배열의 index로 사용한다. 결과 배열은 특정 수에서 길이가 최대가 되는 값을 저장하고 있다. 시간복잡도 측면에서 방법 1)보다 더 나은 방법이다.

n = int(input())
result = [0]*1001

for a in list(map(int, input().split())):
  result[a] = max(result[:a]) + 1 #자신보다 작은 값들 중 길이가 최대인 값 + 1

print(max(result))