본문 바로가기

[Project Euler] Problem 018


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
public class Problem018 {
 
    public static void main(String[] args) {
        System.out.println(run());
    }
    
    public static String run() {
        int[][] arr = {
                {75},
                {9564},
                {174782},
                {18358710},
                {20,  4824765},
                {19,  12375,  334},
                {88,  27773,  76367},
                {9965,  428,  6167092},
                {414126568340807033},
                {41487233473237169429},
                {5371446525439152975114},
                {701133287773177839681757},
                {91715238171491435850272948},
                {6366046889536730731669874031},
                { 462982723,  970987393385360,  423}
        };
        
        for(int i = (arr.length - 2); i >= 0--i) {
            for(int j = 0; j < arr[i].length++j) {
                arr[i][j] += Math.max(arr[i + 1][j], arr[i + 1][j + 1]);
            }
        }
        
        return Integer.toString(arr[0][0]);
    }
}
cs


정답: 1074

실행 시간: 300000ns = 0.0003초 


위에서 아래로 찾아가는 방식이 아니라, 아래에서부터 위로 경로를 찾는 방식이다.

처음에는 위에서 아래로 하려고 했는데, 그런 식으로 16384개의 경로를 찾는다는 건 좀 아닌 것 같아서 거꾸로 찾기로 했다.


밑에서 두 번째 행에서부터 시작해 각 요소들에 그 요소의 밑에 있는 두 값 중 큰 값을 더한다.

63에는 4, 62 중 62를, 66에는 62, 98 중 98를 더하고, 이 과정을 반복하면 경로가 완성된다.

맨 끝부터 시작해 최대 합을 갖는 경로를 유도해나가는 것이다. 

결국  arr[0][0] 에는 최대 합이 저장된다.



'Programming > Solutions' 카테고리의 다른 글

[BAEKJOON] 1475번  (0) 2019.05.07
[Project Euler] Problem 019  (0) 2019.05.04
[BAEKJOON] 2581번  (0) 2019.05.04
[BAEKJOON] 1978번  (0) 2019.05.02
[Project Euler] Problem 017  (0) 2019.04.27