✔ 풀이를 위한 아이디어
✔ 백준 11053번: 가장 긴 증가하는 부분 수열 (수정 전 코드) [메모리 초과]
import sys
from collections import deque
n = int(input())
nums = list(map(int, sys.stdin.readline().split()))
queue = deque([(nums[0], 0)])
ans = 0
while queue:
tmp = queue.popleft()
current_index = tmp[1]
current_num = tmp[0]
count = 1
for i in range(len(nums) - tmp[1] - 1):
if nums[current_index+1] > current_num:
count += 1
current_num = nums[current_index+1]
else:
queue.append((nums[current_index+1], current_index+1))
current_index += 1
if count > ans:
ans = count
print(ans)
✔ 백준 11053번: 가장 긴 증가하는 부분 수열 (수정 후 코드)
import sys
n = int(input())
nums = list(map(int, sys.stdin.readline().split()))
dp = [0]*n
for i in range(n):
for j in range(i): # 자신보다 '앞쪽'에 있는 수들에 대해서 탐색
if nums[i] > nums[j] and dp[i] < dp[j]: # 만약 증가하였는데, 더 좋은걸 들고 있으면?
dp[i] = dp[j] # 내 dp에 넣기!
dp[i] += 1 # 내가 추가됐으므로 항상 1씩 더해주기 / 최초라면 1만 더해줘서 dp 1로 만들기
print(max(dp))
✔ 백준 11054번: 가장 긴 바이토닉 부분 수열
import sys
n = int(input())
nums = list(map(int, sys.stdin.readline().split()))
reversed_nums = nums[::-1] # 리스트 확장 슬라이싱으로 뒤집기
dp = [0]*n
r_dp = [0]*n
ans = [-1]*n
for i in range(n):
for j in range(i):
if nums[i] > nums[j] and dp[i] < dp[j]:
dp[i] = dp[j]
if reversed_nums[i] > reversed_nums[j] and r_dp[i] < r_dp[j]:
r_dp[i] = r_dp[j]
dp[i] += 1
r_dp[i] += 1
for i in range(n):
ans[i] = dp[i] + r_dp[n-i-1] # 겹치게 구하지 않으면, 1 1 과 같은 예제에서 오답이 된다.
print(max(ans)-1)
코로나 2차 백신 맞고 회복한다는 핑계로 너무 오래 쉰 것 같다. 앞으로도 꾸준히 풀자!
✔ 관련 개념