= [백준, python] 11053번 - 가장 긴 증가하는 부분 수열 | 개발하는 쿼카

[백준, 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.


풀이

풀이 확인하기

입력받는 리스트와 memoization을 위한 리스트를 만들어 주고, memoization용 리스트의 길이는 입력 리스트의 길이와 동일하게 만들고 1로 초기화해준다. 이후 반복문으로 돌면서 i번째에 존재하는 값이 j번째에 존재하는 값보다 더 크다면 memoization의 i번째와 j번째값 + 1 을 비교하여 더 큰 값으로 update한다. 이후 memoization용 리스트의 가장 큰 값이 lis의 길이가 된다.

import sys
input = sys.stdin.readline

num = int(input())
lis = list(map(int, input().strip().split()))
mem = [1 for _ in range(len(lis))]

for i in range(1, len(lis)):
    for j in range(0, i):
        if(lis[i] > lis[j]):
            mem[i] = max(mem[i], mem[j]+1)

print(max(mem))