UL :)
UL의 개발 블로그
UL :)
전체 방문자
오늘
어제
  • 분류 전체보기 (220)
    • 일상 (1)
    • 회고록 (7)
    • ChatGPT 아카이빙 (0)
    • PS(Java) (114)
      • 백준 (37)
      • 인프런 강의 문제 (77)
    • Web (69)
      • Spring (18)
      • JPA (7)
      • JSP (9)
      • HTML5 (12)
      • CSS (19)
      • HTTP (0)
      • 보안 (2)
    • Language (5)
      • Java (3)
      • JS (1)
      • Python (1)
    • Git, GitHub (4)
    • Settings (18)
      • IntelliJ (7)
      • Eclipse (2)
      • VSCode (3)
      • Android Studio (1)
      • VMware (2)
      • Mac (0)
    • Etc (1)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • HttpMessageConverter
  • ORM
  • BOJ
  • TABLE 전략
  • @Id
  • 정렬
  • @ManyToOne
  • 영속성
  • 엔티티 매핑
  • @PostMapping
  • EntityManagerFactory
  • 영속성컨텍스트
  • @RequestParam
  • 1차 캐시
  • @Table
  • 백준
  • HandlerMethodArgumentResolver
  • 요청헤더
  • @Column
  • 동일성보장
  • ViewName반환
  • consumes
  • argumentresolver
  • @GetMapping
  • produces
  • SEQUENCE 전략
  • @JoinColumn
  • ReturnValueHandler
  • IDENTITY 전략
  • JPA

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
UL :)

UL의 개발 블로그

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

[PS] 백준 11054번 가장 긴 바이토닉 부분 수열 - DP

2022. 3. 25. 05:48

문제

 

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

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

www.acmicpc.net

 

풀이

가장 긴 ~ 수열 문제에서는 다른 풀이를 참고해서 풀었기 때문에 배열의 길이를 n+1로 잡았었는데, 심화 문제를 풀려니 배열의[0]값을 쓰지 않는게 더 헷갈려서, n으로 잡고 코드를 바꿔서 풀었습니다.

 

10
1 5 2 1 4 3 4 5 2 1

위 예제 를 입력했을 때 dp값은 다음과 같이 저장되고, 두 배열을 더했을 때 최대값을 구하면 된다.

dp[0][*] = {1, 2, 2, 1, 3, 3, 4, 5, 2, 1}
dp[1][*] = {1, 5, 2, 1, 4, 3, 3, 3, 2, 1}

 

으아, 꼼꼼하지 못해서.. 놓친 부분 때문에 붙잡고 있었다.
배열을 더할 때, 원소 하나가 중복되기 때문에 max-1을 해줘야 한다.

 

dp[0][1] + dp[1][1]의 경우
{1} + {1} = {1} : max = 1+1= 2, 길이 1

dp[0][2] + dp[1][2]의 경우
{1, 5} + {5, 4, 3, 2, 1} = {1, 5, 4, 3, 2, 1} : max = 2+5 = 7, 길이 6

 

대충 추상적으로 말고... 좀 더 치밀하게 사고하는 습관을 들여야겠다ㅠ

 

코드

import java.io.IOException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {

        Scanner in = new Scanner(System.in);

        int n = in.nextInt(); //수열의 크기

        int[] arr = new int[n];//값
        int[][] dp = new int[2][n];

        for(int i=0; i<n; i++) { //수열입력받기
            arr[i] = in.nextInt();
        }

        //-> 방향 가장 긴 증가수열 길이 구하기
        dp[0][0] = 1;

        for(int i=1; i<n; i++) {
            dp[0][i] = 1;

            for(int j=0; j<i; j++) {//0부터 현재위치까지 탐색

                if(arr[j] < arr[i] && dp[0][j] >= dp[0][i]) {
                    dp[0][i] = dp[0][j] +1; //길이 +1 누적
                }
            }
        }

        //<- 방향 가장 긴 증가수열 길이 구하기
        dp[1][n-1] = 1;

        for(int i=n-2; i>=0; i--) {
            dp[1][i] = 1;

            for(int j=n-1; j>i; j--) {//맨끝부터 거꾸로 탐색

                if(arr[j] < arr[i] && dp[1][j] >= dp[1][i]) {
                    dp[1][i] = dp[1][j] +1; //길이 +1 누적
                }
            }
        }

        int max = 1;

        for(int i=0; i<n; i++) {
            max = Math.max(max, dp[0][i] + dp[1][i]);
        }

        System.out.println(max-1);

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

'PS(Java) > 백준' 카테고리의 다른 글

[PS] 백준 2579번 계단 오르기  (0) 2022.03.31
[PS] 백준 1912번 연속합  (0) 2022.03.25
[PS] 백준 11722번 가장 긴 감소하는 부분 수열 - DP  (0) 2022.03.25
[PS] 백준 11055번 가장 큰 증가 부분 수열 - DP  (0) 2022.02.09
[PS] 백준 11053번 가장 긴 증가하는 부분 수열 - DP  (0) 2022.02.09
    'PS(Java)/백준' 카테고리의 다른 글
    • [PS] 백준 2579번 계단 오르기
    • [PS] 백준 1912번 연속합
    • [PS] 백준 11722번 가장 긴 감소하는 부분 수열 - DP
    • [PS] 백준 11055번 가장 큰 증가 부분 수열 - DP
    UL :)
    UL :)
    백엔드 개발자를 목표로 달리고 있습니다🔥

    티스토리툴바