본문으로 바로가기

Java :: 적은 비용의 계단 구하기

category Programing/Java 2018. 9. 27. 20:19

각 계단마다 가격이 존재하고 마지막 계단을 밟기까지 최소 비용의 방법을 구하는 프로그램.



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
import java.util.Scanner;
 
/**
 * 
 * 조건을 맞추려고 노력 많이 했습니다!
 * 객체지향 코딩에 대한 이해가 전보다는 나아진것 같습니다.
 * 부족한 부분은 피드백 주세요!!
 * 
 * @author LeeJaeSeung (g0pher)
 */
public class StairDemo {
    public static void main(String [] args) {
        StairDemo start = new StairDemo();
        start.doit();
    }
    void doit() {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Step [] stairs = new Step[N];
        for (int i = 0; i < 3; i++) {
            stairs[i] = new Step(i+1, sc.nextInt());
        }
        for (int i = 3; i < N; i++) {
            stairs[i] = new Step(i+1, sc.nextInt());
            stairs[i].compute(stairs[i-1], stairs[i-2], stairs[i-3]);
        }
        stairs[N-1].print();
    }
}
 
class Step {
    int number;
    int cost;
    int minToHere;
    Step prev = null;
    Step (int number, int cost) {
        this.number = number;
        this.cost = cost;
        minToHere = cost;
    }
    void compute(Step s1, Step s2, Step s3) {
        if (s1.compareTo(s2) == 1) {
            if (s2.compareTo(s3) == 1) { prev = s3; }
            else { prev = s2; }
        }
        else {
            if (s1.compareTo(s3) == 1) { prev = s3; }
            else { prev = s1; }
        }
        minToHere = prev.minToHere + cost;
    }
    void print() {
        if (prev != null) {
            prev.print();
        }
        System.out.printf("[%2d] %d %d\n", number, cost, minToHere);
    }
    int compareTo(Step s) {
        if (minToHere < s.minToHere) { return 0; }
        return 1;
    }
}
cs