알고리즘/백준 알고리즘

[java] 백준 알고리즘 2579번 계단오르기 풀이소스

희랍인 조르바 2018. 5. 9. 10:32


문제를 푸는데 조건을 잘 이해하는게 중요하다고 느끼는데,


세세한 조건을 착각하는 경우가 많다.


이번에도 첫번째 계단을 꼭 밟을 필요가 없지만, 


예시에서는 첫 번째 계단을 시작점과 동시에 밟아야한다고 혼자 착각해서


원리가 맞음에도 불구하고, 초기값으로 넣어줄 세번째 계단 때문에 


계속 틀렸다고 떴다. 첫번째 계단을 건너 뛰고 바로 갈 수도 있는 경우를 넣어줘야했는데 말이다...



아래부터 문제와 풀이!




조건은 총 세가지가 있다.


조건 세가지 모두 만족하려면,


마지막 계단의 점수는 더해주고, 두번째 칸 전(-2)의 계단에서 바로 마지막 계단을 밟든지,


세번째 칸 전(-3)의 계단에서 마지막 계단의 한 칸 전(-1)의 계단을 밟고 마지막 계단을 밟으면 된다.


이렇게 밟으면 계속해서 계단의 텀이 지속해서 2칸씩은 나오기 때문에 


2번째 조건인 세개의 계단을 연속해서 밟지 않을 수 있다. 


*소스


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Baekjoon2579 {
    
    private static BufferedReader br;
    
    public static void main(String[] args) throws NumberFormatException, IOException{
        br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine()); // 입력하는 계단의 갯수
        
        int outputStairScore = maxStairScore(n); // 계단 점수 총합의 최대값
       
        System.out.println(outputStairScore);
        
    }
    
    private static int maxStairScore(int n) throws NumberFormatException, IOException{
        
         int[] eachScoreArray = new int[300]; // 계단의 개수가 300 이하의 자연수
            
         for(int i=0; i<n; i++){
             eachScoreArray[i] = Integer.parseInt(br.readLine()); // 계단 각각 가지고 있는 점수의 배열
         }
         
         int[] maxStairScoreArray = new int[300]; // 계단 점수 총합의 최대값이 모일 배열
         maxStairScoreArray[0= eachScoreArray[0];
         maxStairScoreArray[1= eachScoreArray[0+ eachScoreArray[1];
         
         /* 꼭 첫번째 계단을 밟을 필요는 없다. 시작선이 첫번째 계단은 꼭 밟아야하는 줄 알고 계속 실패했다 ㅠㅠ */
         maxStairScoreArray[2= Math.max(eachScoreArray[0+ eachScoreArray[2], eachScoreArray[1+ eachScoreArray[2]);
         
         if(n>3){
             for(int j=3; j<n; j++){
                 
                /* 3칸 전 계단까지 총합의 최대값+마지막계단의 한 칸 전 계단 점수 합이 큰지, 두 칸 전 계단까지 총합의 최대값이 큰지 비교 */
                 if(maxStairScoreArray[j-3+ eachScoreArray[j-1> maxStairScoreArray[j-2]){
                     
                     maxStairScoreArray[j] = eachScoreArray[j] + maxStairScoreArray[j-3+ eachScoreArray[j-1];  
                 }else{
                     maxStairScoreArray[j] = eachScoreArray[j] + maxStairScoreArray[j-2];
                 }
             }
         }
          
         return maxStairScoreArray[n-1];
    }
}
 
cs