❇️오늘의 학습 키워드 : 가장 긴 바이토닉 부분 수열(백준 #11054)
문제
수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다.
예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다.
수열 A가 주어졌을 때, 그 수열의 부분 수열 중 바이토닉 수열이면서 가장 긴 수열의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 부분 수열 중에서 가장 긴 바이토닉 수열의 길이를 출력한다.
예제 입력 1
10
1 5 2 1 4 3 4 5 2 1
예제 출력 1
7
정답 코드
n = int(input())
nums = list(map(int, input().split()))
# 증가 DP
asc_dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
asc_dp[i] = max(asc_dp[i], asc_dp[j] + 1)
# 감소 DP
des_dp = [1] * n
for i in range(n - 2, -1, -1):
for j in range(n - 1, i, -1):
if nums[j] < nums[i]:
des_dp[i] = max(des_dp[i], des_dp[j] + 1)
# 바이토닉 수열 길이 계산
ans = 0
for i in range(n):
max_length = max(max_length, asc_dp[i] + des_dp[i] - 1)
print(ans)
❇️오늘의 회고
- 두 dp 테이블로 나눠서 풀지 않고 한번에 풀려는 시도를 했다가 실패했다...
- 오름차순 코드를 역순으로 바꾸기만 하면 그대로 재활용 가능하다! 다만 범위는 주의해야한다. (1부터, n-2부터...그리고 i-1까지)
- 이제 코테스터디도 막바지다. 코테스터디 덕분에 코딩테스트에 점점 자신감이 붙고 있다! 끝까지 열심히 하자.
- 내일 11시, 문제를 풀기 전에 위 개념을 한번 더 복습하고 내일 문제에 사용된 알고리즘에 대해서 공부할 것이다!🙂
'99클럽 코테 스터디' 카테고리의 다른 글
99클럽 코테 스터디 33일차 TIL + 회문(백준 #17609) (0) | 2024.11.29 |
---|---|
99클럽 코테 스터디 31일차 TIL + 택배 배송(백준 #5792) (0) | 2024.11.27 |
99클럽 코테 스터디 30일차 TIL - 택배 배달과 수거하기(프로그래머스 #150369) (0) | 2024.11.26 |
99클럽 코테 스터디 29일차 TIL - 타임머신(백준 #11657) (0) | 2024.11.25 |
99클럽 코테 스터디 28일차 TIL - 이모티콘 할인행사(프로그래머스 #150368) (1) | 2024.11.24 |