You will be fine

<Algorithm> 54. 2579번 계단 오르기

by BFine
반응형

1. 2579번 계단 오르기

  • DP문제, 처음에는 DFS로 접근하였는데 시간초과가 발생하였다. 최대의 계단이 300개 인데 이때 수많은 경우가 발생한다. 

  • 문제에 주어진 조건을 자세히 확인한다음 경우의 수가 얼마나 발생하는지 보고 DP인지 다른 알고리즘인지 판단하는게 좋을 것 같다. 

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
 
public class Main {
    
    static int max = Integer.MIN_VALUE;
    static int[] dp = new int[1000001];
    static int[] dp2 = new int[1000001];
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()) + 1;
        int arr[] = new int[N];
        for(int i = ; i < N; i ++) {
            arr[i] =  Integer.parseInt(br.readLine());
        }
        
        dp[0= 0;
        dp[1= arr[1];
        dp[2= arr[1+ arr[2];
        
        
        for(int i = 3; i < arr.length ; i++) {
            dp[i] = Math.max(dp[i-3+ arr[i-1+ arr[i], dp[i-2+ arr[i]);
            // 2칸을 뛰어넘어서 바로 도착하는 경우와  2칸을 뛰고 한칸을 오는 경우 중 최대값을 입력한다.
        }
        
        System.out.println(dp[arr.length-1]);
        
    }
    
    public static void dfs(int[] arr, int count, int index, int total) {
        int[] d = {12};
        
        if(index == arr.length - 1) { 
            if(max < total) max = total;
            return;
        }
        
        
        if(count == 2) {
            if(index + < arr.length) {
                total += arr[index + 2];
                dfs(arr, , index + 2, total);
                total -= arr[index + 2];
                // 백트래킹 
            }
            return;
        }
        
        
        for(int i = 0; i < 2; i ++) {
                
            int nIndex = index + d[i];
            
            if(nIndex < arr.length && count < 2) {
                if(i == 0) {
                    total += arr[nIndex]; 
                    dfs(arr, count + 1, nIndex,total);
                    total -= arr[nIndex];
                }
                else {
                    total += arr[nIndex];
                    dfs(arr, 1, nIndex, total);
                    total -= arr[nIndex];
                }
            }
            
        }        
        
    }
    
}
cs

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기