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

2025. 3. 11. 11:10·Algorithm

문제 파악

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

풀이

DP문제이며 푸는데 오래 걸리지는 않았으나,
문제에서 놓친 부분이 있어 마지막에 정답을 계산하는 과정에서 조금 헤맸다. 문제를 잘 읽도록 하자 ^_^

가장 먼저 오름차순, 내림차순의 길이를 저장하는 DP 배열을 각각 선언해 준다.
DP는 "해당 자리의 숫자를 포함"하여 오름차순, 내림차순을 만족하는 수열의 길이를 저장한다.

증가(혹은 감소) 수열을 만족했을 때 DP값에서 1을 더해 현재 DP에 저장하도록 하자.
오름차순은 인덱스가 증가하는 방향으로, 내림차순은 감소하는 방향으로 순회하도록 했다.

다음 {1,2,2,3,1,4} 수열을 예로 들어 보았다.

마지막으로 정답은 각각의 자리의 오름차순, 내림차순 DP를 더해 준 다음 1을 빼 준 값이 된다.
1을 빼주는 이유는 오름차순 DP, 내림차순 DP 모두 현재 위치의 원소를 포함하기에 중복을 제거해주는 과정이다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int count = Integer.parseInt(br.readLine());
        int[] input = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] ascDP = new int[count];
        int[] descDP = new int[count];
        Arrays.fill(ascDP, 1);
        Arrays.fill(descDP, 1);
        // asc
        for (int i = 0; i < count; i++) {
            for (int j = 0; j < i; j++) {
                if (input[i] > input[j]) {
                    ascDP[i] = Math.max(ascDP[i], ascDP[j] + 1);
                }
            }
        }
        // desc
        for (int i = count - 1; i >= 0; i--) {
            for (int j = i + 1; j < count; j++) {
                if (input[i] > input[j]) {
                    descDP[i] = Math.max(descDP[i], descDP[j] + 1);
                }
            }
        }
        System.out.println(IntStream.range(0, count)
                .map(i -> descDP[i] + ascDP[i] - 1).max().orElse(1));
    }
}

 

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

'Algorithm' 카테고리의 다른 글

[백준] 1806 - 부분 합(Java)  (0) 2025.03.18
[백준] 1394 - 암호(Java)  (0) 2025.03.13
[백준] 1375 - 나이(Java)  (0) 2025.02.20
[백준] 1197 - 최소 스패닝 트리(Java)  (1) 2025.02.04
[백준] 12180 - Googlander (Java)  (0) 2025.01.23
'Algorithm' 카테고리의 다른 글
  • [백준] 1806 - 부분 합(Java)
  • [백준] 1394 - 암호(Java)
  • [백준] 1375 - 나이(Java)
  • [백준] 1197 - 최소 스패닝 트리(Java)
코드파고
코드파고
  • 코드파고
    Digging Code
    코드파고
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • Memorization (12)
      • Spring (18)
      • Java (1)
      • Algorithm (40)
      • Server (2)
      • DB (0)
      • CS (0)
      • CI & CD (4)
      • Architecture (0)
      • Design Patterns (0)
      • Study (1)
      • Book (9)
        • DEV (7)
        • Non-DEV (0)
      • Infra (1)
        • Kafka (6)
        • AWS (4)
      • TroubleShooting (1)
        • Etc (1)
      • Tools (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    헥사고날아키텍쳐
    Spring독학
    알고리즘
    Spring Boot
    architecture
    Spring
    Clean Code
    clean architecture
    클린아키텍쳐
    SpringFramework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
코드파고
[백준] 11054 - 가장 긴 바이토닉 부분 수열(Java)
상단으로

티스토리툴바