본문 바로가기

알고리즘/python

[python / 파이썬] 백준 11053 가장 긴 증가하는 부분 수열

반응형

문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

예제 입력 1 복사

6
10 20 10 30 20 50

예제 출력 1 복사

4

 

 

[소스 코드]

 

이중 for문을 이용하여 푸는 dp문제이다.

수열의 시작이 어디가 될지 모르기 때문에 이중 for문을 사용하였다.

 

문제의 예시를 살펴보자

<arr>

0 1 2 3 4 5
10 20 10 30 20 50

 

<dp>

0 1 2 3 4 5
1 2 1 3 2 4

 

i = 0 일 때는 10이라는 원소 하나로 부분 수열을 만들기 때문에 당연히 1이 된다.


i = 1 / j = 0

arr[1] > arr[0]  : 20 < 10

dp[1] < dp[0] : 0 < 1 //dp[1]은 아직 채워지기 전이기 때문에 0으로 초기화된 상태이다

=> dp[1] = 1

dp[1] = 1 + 1 = 2


i = 2 / j = 0

arr[2] == arr[0] : 10 == 10

x

i = 2 / j = 1

arr[2] < arr[1] : 10 < 20

x

dp[2] = 0 + 1 = 1


i = 3 / j = 0

arr[3] > arr[0] : 30 > 10

dp[3] < dp[0] : 0 < 1 //dp[3]은 채워지지 않은 상태

dp[3] = 1

 

i = 3 / j = 1

arr[3] > arr[1] : 30 > 20

dp[3] < dp[1] : 1 < 2

dp[3] = 2

 

i = 3 / j = 2

arr[3] > arr[2] : 30 > 10

dp[3] > dp[1] : 2 > 1

x

 

dp[3] = 2 + 1 = 3

 

...

이러한 과정을 거쳐서 dp[5]까지 채워지게 된다.

 

그리고는 가장 큰 값을 출력한다.

 

n = int(input())

arr = list(map(int,input().split()))

dp = [0 for i in range(n)]

for i in range(n):
    for j in range(i):
        if arr[i]>arr[j] and dp[i] < dp[j]:
            dp[i] = dp[j]
            
    dp[i] += 1

print(max(dp))
반응형