반응형
문제
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
코드
n = int(input())
num = list(map(int, input().split()))
dp = [1 for i in range(n)]
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp[i] = max(dp[i], dp[j]+1)
print(max(dp))
설명
우선 다음과 같은 메커니즘을 거치게 된다.
1. 현재 위치의 숫자(num[i])가 이전에 있는 숫자(num[j])보다 큰지 확인한다.
2. 크다면, dp[i]의 값을 dp[i]의 현재 값과 dp[j]에 1을 더한 값 중 큰 값으로 갱신한다.
(이때, j는 i보다 작은 모든 값)
10 | 20 | 10 | 30 | 20 | 50 |
1 | 2 | 1 | 3 | 2 | 4 |
1. 처음 10의 경우(i = 0) 부분수열은 자기 자신밖에 없으므로 1을 입력해 준다.
2. 20의 경우 부분수열은 {10, 20}, {20} 이 가능하므로 최대 길이인 2를 입력해 준다.
3. 2번째 10의 경우 증가하는 부분수열에 포함될 수 없으므로 초기값 1에서 변화가 없다.
4. 30의 경우 {10,20,30}, {10, 30}, {30} 등과 같이 가능하지만 이 중 최댓값인 3을 입력해 준다.
(dp[1]의 {10,20}에 30을 더한 케이스)
이러한 단계를 거친다.
최종적으로 가장 큰 dp값을 출력한다.
반응형
'개발 연습장 > 백준 문제풀이' 카테고리의 다른 글
[파이썬, Python] 백준 1049: 기타줄 (0) | 2023.06.27 |
---|---|
[파이썬, Python] 백준 1021: 회전하는 큐 (0) | 2023.06.23 |
[파이썬, Python] 백준 9656: 돌 게임 2 (0) | 2023.06.21 |
[파이썬, Python] 백준 1120: 문자열 (0) | 2023.06.20 |
[파이썬, Python] 백준 9375: 패션왕 신해빈 (2) | 2023.06.19 |