[백준] 11054 - 가장 긴 바이토닉 부분 수열 (G3)

2021. 8. 10. 19:02·알고리즘 (PS)/BOJ
반응형

 


문제 소개


https://www.acmicpc.net/problem/11054

 

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

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

www.acmicpc.net

가장 긴 증가하는 부분 수열의 응용문제이다.

가장 긴 증가하는 부분 수열의 풀이 과정을 정확하게 이해하고 있다면, 이 문제 역시 어렵지 않게 풀 수 있다.

(골드3 난이도길래 특별한 코너케이스가 숨어있는 줄 알았는데, 다행히 그런 건 없었다.)

 

11053 가장 긴 증가하는 부분 수열

https://www.acmicpc.net/problem/11053

 

9465 스티커

https://www.acmicpc.net/problem/9465

 

이 두 문제를 정확하게 이해하고 풀 수 있다면, 이 문제를 간단하게 풀 수 있다.

스티커 문제의 포스팅에서도 언급했지만, 직전 상황에 따라 현재 상황이 좌우된다면,

직전의 상황을 상황별로 저장해두면 된다.


풀이 아이디어


이 문제는 '증가하고 있는 상황' 과 '감소하고 있는 상황' 이 있고,

각각의 상황에 따라서 i번째 수를 포함한 가장 긴 바이토닉 부분수열의 길이가 달라진다.

 

따라서

1. i번째 수를 넣었을 때도 여전히 증가하고 있는 상황

2. i번째 수를 넣었을 때부터 감소 / i번째 수를 넣었을 때도 여전히 감소하고 있는 상황

 

이렇게 두 가지 상황을 나누어서 dp 배열에 저장하면된다.

이때 2번에 해당하는 점화식은 감소하는 상황만 저장하면 안된다.

1, 2, 3, 2, 1

 

이렇게 증가하다가 감소하는 상황을 같이 저장하기 위해서는

기존에 증가하고 있던 수열에 자기 자신을 붙이면서 감소하기 시작하는 경우도 넣어야 한다.

 

1번 상황과 2번상황을 하나의 2차원 배열에 모두 저장하되

1번 상황은 dp[0]에 저장하고

2번 상황은 dp[1]에 저장한다고 해보자

 

그렇다면 각 상황별 점화식은 다음과 같다.

1번 상황 점화식 : dp[0][i] = max(dp[0][0], dp[0][1], ... , dp[0][i-1]) + 1

단, max값이 없을 경우 1 저장 (자기자신만 수열에 존재)

 

0번째부터 i-1번째까지 반복하면서 해당 수를 포함하는 가장 긴 증가하는 수열 길이에 1을 더하여 구한다.

 

2번 상황 점화식 : dp[1][i] = max(dp[0][0], dp[1][0], dp[0][1], dp[1][1], ..., dp[0][i-1], dp[1][i-1]) + 1

단, max 값이 없을 경우 1 저장 (자기자신만 수열에 존재)

 

마찬가지로 0번째부터 i-1번째까지 반복하면서 해당 수를 포함하는 가장 긴 증가하거나 바이토닉인 수열 길이에

1을 더하여 구한다.


각 i 마다 0 부터 i-1까지 순회하기에 연산 횟수는 1부터 n까지의 합과 같다.

따라서 시간복잡도는 O(n^2) 이다.

n이 최대 1000 이므로 1초 내에 충분히 풀 수 있다.


정답 코드


# 11054 가장 긴 바이토닉 부분 수열
n = int(input())
nums = list(map(int, input().split()))
dp = [ [], [] ]
for i in range(n):
    ascendMax, descendMax = 0, 0
    for j in range(i):
        if nums[j] < nums[i]:
            ascendMax = max(ascendMax, dp[0][j])
        if nums[j] > nums[i]:
            descendMax = max(descendMax, dp[1][j], dp[0][j])

    dp[0].append(ascendMax + 1)
    dp[1].append(descendMax + 1)

answer = 0
for i in range(n):
    answer = max(answer, dp[0][i], dp[1][i])

print(answer)

한번 i에 대해 체크할 때 증가하는 부분 수열과, 바이토닉 부분 수열을 동시에 체크하도록 했다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 20129 - 뒤집힌 계산기 (G3)  (2) 2021.08.17
[백준] 2376 - 단말 정점들의 거리 (P5)  (0) 2021.08.14
[백준] 14653 - 너의 이름은  (0) 2021.08.07
[백준] 9465 - 스티커  (0) 2021.07.29
[백준] 2437 - 저울  (0) 2021.07.17
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 20129 - 뒤집힌 계산기 (G3)
  • [백준] 2376 - 단말 정점들의 거리 (P5)
  • [백준] 14653 - 너의 이름은
  • [백준] 9465 - 스티커
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615) N
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45) N
        • 생각 정리 (23) N
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 11054 - 가장 긴 바이토닉 부분 수열 (G3)
상단으로

티스토리툴바