실버2
2주동안 BFS/DFS 문제를 쉬운 것 부터 풀어보고 실버 -> 골드까지 풀어볼 예정이다.
먼저 해당 유형의 기본 문제를 풀어보자.
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

풀이
길이 기록용 리스트를 1로 만들어서 각 요소의 길이를 기록
i와 j를 사용해서 현재값i과 이 전 값들(j들)의 요소 크기를 비교하고 현재값이 크다면 이전 값 요소의 길이 + 1과 현재값을 비교해서 큰 값을 현재값의 길이로 저장.
이 전 값들의 데이터를 재사용하여 dp로 풀 수 있다.
import sys
input = sys.stdin.readline
N = int(input())
lst = list(map(int, input().split()))
# lst 수열과 같은 수열을 만들어
lenlst = [1] * len(lst)
#i번째랑 이 전 값을 비교해서 크면 lenlst에 길이로 큰 값을 저장, 작으면 ㅃㅇ
#max()로 비교해서 넣는 이유는 현재 자신의 길이값 vs 나보다 작은 요소의 길이 뒤에 붙으면 큰 값 중 큰 것에 붙는 것
for i in range(len(lst)):
j = 0
for j in range(i):
if lst[j] < lst[i] :
lenlst[i] = max( lenlst[i], lenlst[j]+1 )
print(max(lenlst))
처음에 접근할 때에 어떻게 비교를 해야할지 판단이 안 섰다.
i를 늘려가면서 j를 0으로 초기화하고 i전까지 j하나씩 비교를 해가면 된다.
그리고 길이 리스트를 만들어서 1로 초기화해서 길이를 저장해두고,
j<i일 때에 해당 j의 길이 뒤에 붙을 수 있기 때문에 i의 길이값을 j길이값+1 과 i길이값을 비교해서 큰 쪽에 붙는다.
*길이 수열 만들기, 탐색을 이중포문으로 현재값과 이전값 비교
*왜 이전값을 기준으로 탐색할까? 왜 다음 j는 i범위 전에서만 확인할까?
i=0을 계산할 때 j=2(미래)를 참조하면
→ lenlst[2]는 아직 제대로 계산이 안 된 초기값 1
→ 나중에 lenlst[2]가 업데이트돼도 lenlst[0]은 이미 틀린 값으로 고정
i 이전에 있는 것들이 다 확정된 후에 계산되어야 하는데, range(len(lst))는 아직 확정 안 된 미래 값을 미리 참조해버리는 것이기 때문
'Problem Solvings > baekjoon' 카테고리의 다른 글
| 백준 9095번 1,2,3 더하기 | py 풀이 (0) | 2026.04.06 |
|---|---|
| 백준 1697번 - 숨바꼭질 | py풀이 (1) | 2026.03.30 |
| 2178번 - 미로 탐색 | py 풀이 (0) | 2026.03.26 |
| 2667번 - 단지번호 붙이기 | py 풀이 (0) | 2026.03.24 |



