자바생
728x90

오답 노트 & 새로 알게 된 점

전에 풀었던 문제는 일차원 배열로 해결했다. 이번에는 이차원 배열을 이용하였다.

 

해당 문제는 강의를 통해 풀었던 문제이다.

이런 생각은 어떻게 할까,,, 라는 생각이 들었던 문제이다.

 

dp[i][0]은 i-1번째 계단을 밟지 않고 i번째 계단을 밟을 경우,

dp[i][1]은 i-1번째 계단을 밝고 i 번째 계단을 밟을 경우이다.

 

그래서 dp[i][0]을 구하기 위해서는

i-1번째 계단을 밟지 않을 경우에는 연속 세 계단을 어차피 오를 수 없기 때문에 

dp[i-2][0]과 dp[i-2][1]중 최댓값을 고르면 된다.

 

dp[i][1]은 i-1번째 계단을 밟을 경우이므로, i-2번째 계단을 밟으면 안 된다.

그래서 dp[i-1]계단에서 i-2계단을 밟지 않아야 하므로, dp[i-1][1]에서 arr[i]을 더하면 된다.

 


 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package Dynamic_Programming;
 
import java.io.*;
 
public class BOJ2579_2{
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int size = atoi(br.readLine());
        int arr[] = new int[size+1];
 
        for (int i = 1; i <= size; i++) {
            arr[i] = atoi(br.readLine());
        }
 
        int dp[][] = new int[size+1][2];
 
        dp[1][0= 0;
        dp[1][1= arr[1];
 
        if (size >= 2) {
            dp[2][0= arr[2];
            dp[2][1= arr[1+ arr[2];
        }
 
        for (int i = 3; i <= size; i++) {
            dp[i][0= Math.max(dp[i - 2][0], dp[i - 2][1]) + arr[i];
            dp[i][1= dp[i - 1][0+ arr[i];
        }
 
        System.out.println(Math.max(dp[size][0], dp[size][1]));
    }
}
 
cs
728x90

'BOJ(Java)' 카테고리의 다른 글

자바(백준) 1922 네트워크 연결  (0) 2021.08.02
자바(백준) 11403 경로 찾기  (0) 2021.07.30
자바(백준) 2011 암호코드  (2) 2021.07.25
자바(백준) 11057 오르막 수  (0) 2021.07.25
자바(백준) 11052 카드 구매하기  (0) 2021.07.13
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그