알고리즘/알고리즘_백준

[Python][백준] 11053. 가장 긴 증가하는 부분 수열/ DP (S2)

Jerry_K 2024. 9. 18. 21:37

🔗링크 :  

https://www.acmicpc.net/problem/11053


🗒️파이썬 코드 풀이

N = int(input())
lst = list(map(int,input().split()))
dp = [1] * N 

for i in range(1,len(lst)):
    for j in range(i):
        if lst[i] > lst[j] :
            dp[i] = max(dp[i],dp[j]+1)
print(max(dp))

 

1. 이전 값들은 계속 다음 값들에 영향을 주기 때문에 DP를 생각한다. 

 

2. 브루트포스 방식으로 하나 하나 조사를 하고, 자신보다 작은 경우 dp 값을 갱신해준다.

 

3. 갱신 할 때, 가장 큰 값들만 갱신되게 하면 되므로 max 함수를 이용한다. 

 

4. 이후 완성된 DP 리스트에 최대값을 출력하면 된다. 

 

 

📌 문제 코멘트

코드 결과만 보면 DP만큼 쉬운 것도 없다. 근데 이걸 어떻게 구현하느냐가 잘 생각나지 않는다. DP 관련 문제들을 꾸준히 많이 풀어봐야 겠다. 

 

DP에서는 max 함수를 잘 써야하는 것 같다.


📚문제

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

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {1020, 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