선릉역 1번 출구

baekjoon - 14002 본문

Algorithm/Algorithm 문제풀이

baekjoon - 14002

choideu 2021. 9. 16. 21:15

problem. 가장 긴 부분의 갯수 출력(11053과 동일), 부분 수열 출력

 

key point

이중 for문을 돌릴 때 

for i in range(n):
    k = 0
    for j in range(i):
        if ls[j] < ls[i]:
            if dp[i] < dp[j] + 1:
                k = j // 이 부분
            dp[i] = max(dp[i], dp[j] + 1)
    dp_2.append(k)

#이 부분에서 dp[j] +1 한 값이 더 크면 부분 배열에서 ls[j]번 뒤에 ls[i]이 붙는 것이다.

그럼 j를 따로 배열에 넣어주면? 결국 0~n까지 배열이 만들어지고, 자기 바로 앞에 있는 ls의 index를 가리키게 되는 것이다.

그래서 이 값을 따로 찾아서 kk라는 배열에 넣어준 뒤 오름차순으로 출력해야해서 reverse()를 해주고 출력했다.

 

import sys

n = int(input())
ls = list(map(int, sys.stdin.readline().split()))

dp = [1] * n
dp_2 = []
kk = []

for i in range(n):
    k = 0
    for j in range(i):
        if ls[j] < ls[i]:
            if dp[i] < dp[j] + 1:
                k = j
            dp[i] = max(dp[i], dp[j] + 1)
    dp_2.append(k)
            
print(max(dp))

a = dp.index(max(dp))

while len(kk) != max(dp):
    kk.append(ls[a])
    a = dp_2[a]
    
kk.reverse()

for i in kk:
    print(i, end=" ")

다시 느낀 건데 코드짤 때 변수명을 제대로 짓는 버릇을 들여놔야겠다 ..ㅎㅎ

'Algorithm > Algorithm 문제풀이' 카테고리의 다른 글

baekjoon - 15500  (0) 2021.10.03
baekjoon - 1912  (0) 2021.09.16
baekjoon - 11053  (0) 2021.09.15
baekjoon - 2193  (0) 2021.09.13
baekjoon - 10844  (0) 2021.09.13
Comments