출처:11054번: 가장 긴 바이 토닉 부분 수열 (acmicpc.net)
[가장 긴 바이토닉 부분 수열 ]성공분류
시간제한, 메모리 제한, 제출, 정답 맞은 사람, 정답 비율
1 초 | 256 MB | 20195 | 10579 | 8400 | 52.301% |
문제
수열 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의 부분 수열 중에서 가장 긴 바이토닉 수열의 길이를 출력한다.
문제를 이해하는 게 모든 풀이의 가장 기초 이 문제에서 가장 중요한 부분은 바로 이것이다!
S1 < S2 <... Sk-1 < Sk > Sk+1 >... SN-1 > SN
수가 등차로 증가했다가 감소하는 수열의 길이가 가장 긴 것을 찾아라.
즉, 가장 길게 증가하는 수열과 가장 길게 감소하는 수열 합하면 될 것이다.
그럼 가장 길게 증가하는 수열을 만드는 것만 이해하면 가장 감소는 그 반대로 구하면 되고, 바이 토닉은 기합을 구하면 되므로, 가장 길게 증가하는 수열의 원리를 찾아보자!!
이를 바탕으로 코딩을 합니다.
11054번 코드:
import sys
N = int(sys.stdin.readline())
subsequence = list(map(int, sys.stdin.readline().split()))
dp = [1] * N
# 가장 긴 증가 수열
for i in range(1, N):
for j in range(i):
if subsequence[i] > subsequence[j]:
dp[i] = max(dp[i], dp[j] + 1)
# 가장 긴 감소 수열
for i in range(1, N):
for j in range(i):
if subsequence[i] < subsequence[j]:
dp[i] = max(dp[i], dp[j] + 1)
print(max(dp))
코드와 설명을 바탕으로 음미해보시면 이해가 되실 것입니다.
후기
확실히 복습의 속도는 더 빠르고, 복습을 하지 않으면 역시 했던것들을 다 까먹었네요.
다시 기억을 더듬고, 다시 이해하면서 새로히 공부하는 느낌이 좋습니다.
'백준 코딩 테스트' 카테고리의 다른 글
백준 - 11724번 연결 요소의 개수 (0) | 2021.02.14 |
---|---|
백준 - 1260번 DFS와 BFS (0) | 2021.02.14 |
백준 - 2225번 합분해 (0) | 2021.02.11 |
백준 1463번 - 1로 만들기 (0) | 2021.01.28 |
백준 10991번 별찍기 - 2 (0) | 2021.01.23 |