[BOJ] 백준 11054. 가장 긴 바이토닉 부분 수열

2024. 2. 21. 08:53· Java/BOJ

문제

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

 

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

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

www.acmicpc.net


풀이

백준 11053. 가장 긴 증가하는 부분 수열의 문제와 매우 유사한 DP 문제입니다. 

더보기

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

 

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

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net


위 문제의 소스코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();

		int[] arr = new int[N];
		int[] dp = new int[N];

		Arrays.fill(dp, 1);

		for (int i = 0; i < N; i++) {
			arr[i] = sc.nextInt();
		}
		int max = -1;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < i; j++) {
//앞의 숫자와 비교하며 만약 작은 수가 있다면, 그 작은 수의 dp값에 1을 더하고 그 값을 현재 dp값과 비교해 큰 값을 넣는다.
				if (arr[i] > arr[j]) dp[i] = Math.max(dp[i], dp[j] + 1);
   
			}
			max = Math.max(max, dp[i]);
		}
		System.out.print(max);

	}
}

 

 

 

 바이토닉 부분 수열 문제도 이를 활용한 것인데, dp를 두 번 선언하여 앞에서부터 뒤로 가며 최대 증가 수열 길이를 체크하는 dp1[], 그리고 뒤에서 앞으로 오면서 최대 증가 수열 길이 dp2[]을 저장합니다.

 

 문제에서 주어진 입력 값 예시를 대입하면

dp1[] = { 1 2 2 1 3 3 4 5 2 1 },

dp2[] = { 1 5 2 1 4 3 3 3 2 1 }

로 나오게 됩니다.

 

 그리고 dp1[]과 dp2[] 를 더해 가장 큰 값에 1를 뺀 값(겹치는 횟수 제외)이 정답입니다. 

 


소스코드

import java.util.Arrays;
import java.util.Scanner;

public class B11054_가장긴바이토닉부분수열 {

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int N = sc.nextInt();
        int[] nums = new int[N];
        int[] dp1 = new int[N];
        int[] dp2 = new int[N];
        int[] dp = new int[N];
        Arrays.fill(dp1,1);
        Arrays.fill(dp2,1);
        for(int i = 0 ;i<N;i++){
            nums[i] = sc.nextInt();
        }
        for(int i = 0;i<N;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp1[i] = Math.max(dp1[i],dp1[j]+1);
            }
        }
        for(int i = N-1;i>=0;i--){
            for(int j=N-1;j>i;j--){
                if(nums[i]>nums[j]) dp2[i] = Math.max(dp2[i],dp2[j]+1);
            }
        }
        int ans = -1;
        for(int i = 0;i<N;i++){
            dp[i] = dp1[i]+dp2[i];
            ans = Math.max(dp[i],ans);
        }
        System.out.println(ans-1);
    }
}

 

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 25195. Yes or yes  (0) 2024.02.26
[BOJ] 백준 2573. 빙산  (0) 2024.02.22
[BOJ] 백준 10610. 30  (0) 2024.02.20
[BOJ] 백준 3005. 탈출  (0) 2024.02.18
[BOJ] 백준 1238. 파티  (0) 2024.01.20
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 25195. Yes or yes
  • [BOJ] 백준 2573. 빙산
  • [BOJ] 백준 10610. 30
  • [BOJ] 백준 3005. 탈출
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스택
  • 반효경
  • 이석복
  • 김영한
  • 구현
  • 한양대
  • 자바
  • 인프런
  • BOJ
  • Java
  • 자바스크립트
  • 네트워크
  • OS
  • JCF
  • 운영체제
  • 프로그래머스
  • 레디스
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 백준
  • 큐

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 11054. 가장 긴 바이토닉 부분 수열
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.