본문 바로가기

백준 코딩 테스트

백준 - 11054번 가장 긴 바이토닉 부분 수

728x90

출처:11054번: 가장 긴 바이 토닉 부분 수열 (acmicpc.net)

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.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

수가 등차로 증가했다가 감소하는 수열의 길이가 가장 긴 것을 찾아라.

즉, 가장 길게 증가하는 수열과 가장 길게 감소하는 수열 합하면 될 것이다.

 

그럼 가장 길게 증가하는 수열을 만드는 것만 이해하면 가장 감소는 그 반대로 구하면 되고, 바이 토닉은 기합을 구하면 되므로, 가장 길게 증가하는 수열의 원리를 찾아보자!!

 


그림 1. 가장 긴 증가수열 설명


이를 바탕으로 코딩을 합니다.

 

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))

 

코드와 설명을 바탕으로 음미해보시면 이해가 되실 것입니다.

 


후기

 

확실히 복습의 속도는 더 빠르고, 복습을 하지 않으면 역시 했던것들을 다 까먹었네요.

다시 기억을 더듬고, 다시 이해하면서 새로히 공부하는 느낌이 좋습니다.

728x90

'백준 코딩 테스트' 카테고리의 다른 글

백준 - 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