Koala - 10기/코딩테스트 준비 스터디

[백준/python] 11055 가장 긴 증가하는 수열

sebinChu 2023. 3. 19. 03:53

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

[알고리즘]

이 문제는 주어지는 리스트 크기만큼 dp를 먼저 선언해두고 계속해서 값을 갱신해주는 방식이다. 배열 원소들의 크기를 비교한 뒤, 바로 count를 해주면 되지않나?라고 생각을 했는데 "수열의 길이"를 구하라고 했기 때문에 dp[i]에 계속 누적을 해줘야 하고 누적된 값들 중, 최댓값을 찾아야 하므로 dp[i], dp[j]+1 중 최댓값을 도출해주는 것이다. 또한 max(dp[i], dp[j]+1)는 결국 li[i] 보다 더 작은 위치에 있는 dp 테이블들 중에서 가장 큰 값으로 바꿔준다는 뜻이다. 그래야 가장 긴 수열의 길이를 도출할 수 있으니까..!

[시간복잡도]

크기가 N인 수열을 이중포문을 통해 비교하므로, O(N**2)

[최종코드]

n = int(input())
li = list(map(int, input().split()))
dp = [1 for _ in range(n)]
for i in range(n) : 
    for j in range(i) : 
        # 0부터 i까지니까 앞의 수들 검사 가능..
        if li[i] < li[j] : 
            # 증가하면 갱신
            dp[i] = max(dp[i], dp[j]+1)
            # print(dp)

print(max(dp))