선릉역 1번 출구
baekjoon - 14002 본문
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