[백준] 9465 : 스티커 - JAVA [자바]

2025. 6. 18. 15:43·PS/BAEKJOON

안녕하세요.

오늘은 스티커 문제를 풀어보도록 하겠습니다.

 

 

    📌 접근

    다이나믹 프로그래밍을 이용해서 풀어야합니다.

    점화식은 다음과 같이 세우면 됩니다.

    dp[0][j] = Math.max(dp[1][j - 1], dp[1][j - 2]) + cost[0][j];
    dp[1][j] = Math.max(dp[0][j - 1], dp[0][j - 2]) + cost[1][j];

     

     

    풀이를 위해서는,

    각 스티커의 비용을 저장하는 cost배열과

    해당 스티커를 뗐을 때 누적 최대 점수를 저장하는 dp배열가 필요합니다.

     

     

    dp[0][j] 구하기

    빨간색 스티커의 위치를 dp[0][j]라고 가정해봅시다.

    빨간색 스티커를 떼기 전에 가능한 case는 2가지 입니다.

     

     

     

     

     

     

     

    case1) 직전에 dp[1][j-1]을 뗀 경우

     

     

     

    case2) 직전에 dp[1][j-2]을 뗀 경우

     

     

     

     

     

     

     

     

     

    💻 풀이

    // hyeblee
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main {
    
      /* dp[0][j]의 이전 선택하는 dp[1][j-1]과 dp[1][j-2]가 있다.
       *  dp[0][j-2]는 dp[1][j-1]의 이전 선택이 될 수도 있기 때문에 제외한다.
       *  <점화식>
       *  dp[0][j] = Math.max(dp[1][j-1], dp[1][j-2]) + cost[0][j]
       *  dp[1][j] = Math.max(dp[0][j-1], dp[0][j-2]) + cost[1][j] */
    
      public static int n;
      public static int[][] cost;
      public static int[][] dp;
    
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
        int t = Integer.parseInt(br.readLine());
    
        for (int i = 0; i < t; i++) {
          n = Integer.parseInt(br.readLine());
          cost = new int[2][n];
          dp = new int[2][n];
          StringTokenizer st1 = new StringTokenizer(br.readLine());
          StringTokenizer st2 = new StringTokenizer(br.readLine());
          for (int j = 0; j < n; j++) {
            cost[0][j] = Integer.parseInt(st1.nextToken());
            cost[1][j] = Integer.parseInt(st2.nextToken());
          }
          dp[0][0] = cost[0][0];
          dp[1][0] = cost[1][0];
          int max = Math.max(dp[0][0], dp[1][0]);
          for (int j = 1; j < n; j++) {
            if (j == 1) { // 전전칸이 존재하지 않는 경우
              dp[0][1] = dp[1][0] + cost[0][j];
              dp[1][1] = dp[0][0] + cost[1][j];
              max = Math.max(dp[0][1], dp[1][1]);
              continue;
            }
            // 점화식에 dp[0][j-2]를 포함하지 않는 이유는 dp[1][j-1]의 이전선택일수도 있기 때문
            dp[0][j] = Math.max(dp[1][j - 1], dp[1][j - 2]) + cost[0][j];
            dp[1][j] = Math.max(dp[0][j - 1], dp[0][j - 2]) + cost[1][j];
            max = Math.max(max, Math.max(dp[0][j], dp[1][j]));
          }
          System.out.println(max);
        }
    
      }
    
    
    }

     

    🤔 고민했던 점 & 어려웠던 부분

    dp[0][j]의 이전 선택에 dp[0][j-2]는 빠져야하는 것이 이해가 되지 않아서 풀이를 헤맸습니다.

     

     

    dp[0][j-2] 은 dp[0][j]의 이전 선택으로 고려하지 않는 이유

     

    dp[0][j-2]의 케이스는 고려하지 않습니다.

    dp[1][j-1]의 직전 선택이 될 수 있기 때문입니다.

    'PS > BAEKJOON' 카테고리의 다른 글

    [백준] 14889번 : 스타트와 링크 - JAVA [자바]  (0) 2025.07.01
    [백준] 1916 : 최소비용 구하기 - JAVA [자바]  (0) 2025.06.19
    [백준] 15652 : N과 M (5) - JAVA [자바]  (1) 2025.04.09
    [백준] 15652 : N과 M (4) - JAVA [자바]  (1) 2025.04.08
    [백준] 16954 : 움직이는 미로 탈출 - JAVA [자바]  (0) 2025.04.06
    'PS/BAEKJOON' 카테고리의 다른 글
    • [백준] 14889번 : 스타트와 링크 - JAVA [자바]
    • [백준] 1916 : 최소비용 구하기 - JAVA [자바]
    • [백준] 15652 : N과 M (5) - JAVA [자바]
    • [백준] 15652 : N과 M (4) - JAVA [자바]
    hyeblee
    hyeblee
    감자감자
    • hyeblee
      hyeblee
      hyeblee
    • 전체
      오늘
      어제
      • 분류 전체보기
        • PS
          • Programmers
          • BAEKJOON
          • CODETREE
        • ALGORITHM
        • JAVA
        • CS
          • 면접을 위한 CS전공지식
        • SPRING
        • 회고
    • 블로그 메뉴

      • 홈
      • 태그
      • 방명록
    • 링크

      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

      날짜와 시간 계산
      구간 칠하기
      흐른 시간 계산
      java #deque #자바 #덱
      백트래킹
      상한값
      dfs
      탐색
      숨바꼭질3
      java #스프링부트 #자바버전 #자바 버전 충돌 #jvm
      플레이데이터 백엔드 부트캠프 후기
      백준
      플레이데이터 백엔드
      backjoon
      java
      spring #springboot #스프링 #스프링부트
      플레이데이터 백엔드 부트캠프
      왔다 갔던 구역2
      arrays.sort #collections.sort #list.sort #객체정렬 #배열정렬 #timsort #dual pivot quicksort #정렬 #자바
      자바
      16954
      spring #스프링 #스프링부트 #springboot #please sign in
      알고리즘
      15652
      흐른 일수 계산
      플레이데이터 백엔드 후기
      BFS
      하한값
      BOJ
      반닫힌 구간
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    hyeblee
    [백준] 9465 : 스티커 - JAVA [자바]
    상단으로

    티스토리툴바