CodeWars 아흔 네 번째 문제

Updated:

Pyramid Slide Down

class Slide{
	int number;
	int row;
	int col;
}

public class LongestSlideDown {

    public static int longestSlideDown(int[][] pyramid) {
    	
    	Slide[] sum = new Slide[1];
    	sum[0] = new Slide();
    	sum[0].number = pyramid[0][0];
    	sum[0].row = 0;
    	sum[0].col = 0;
    	
    	Slide[] result = slideDown(pyramid, sum, 1);
    	
    	return findMax(result);
    }

	private static int findMax(Slide[] result) {
		
		int max = 0;
		
		for(int i = 0; i < result.length; i++) {
			if(result[i].number > max) {
				max = result[i].number;
			}
		}
		
		return max;
	}

	private static Slide[] slideDown(int[][] pyramid, Slide[] sum, int row) {
		
		if(row == pyramid.length) {
			return sum;
		}
		
		Slide[] newSum = new Slide[(int)Math.pow(2, row)];

		for(int i = 0, j = 0; i < sum.length; i++) {
			newSum[j] = new Slide();
			newSum[j].number = sum[i].number + pyramid[sum[i].row + 1][sum[i].col]; // 왼쪽
			newSum[j].row = sum[i].row + 1;
			newSum[j].col = sum[i].col;
			j++;
			newSum[j] = new Slide();
			newSum[j].number = sum[i].number + pyramid[sum[i].row + 1][sum[i].col+1]; // 오른쪽
			newSum[j].row = sum[i].row + 1;
			newSum[j].col = sum[i].col + 1;
			j++;
		}
		
		return slideDown(pyramid, newSum, row+1);
	}
}
  • 이번 문제는 성공하지 못했다.
  • 일단 기본적으로 나는 완전 탐색을 생각했다. 최종 나올 수 있는 모든 결과 값 중에 최대 값을 찾으려고 했다.
  • 물론 내가 짠 코드는 15 행까지 정도는 가능하다. 그러나… 행이 엄청 커진다면 TIME OUT이 발생한다.
  • 6시간 이상 풀다가 지쳐서 결국 BEST 코드를 보기로 했다.
  • BEST 코드는 역시 BEST였다.
  • 나는 처음부터 내려가는 것을 생각했으나 BEST 코드의 경우 아래에서 위로 올라오는 것을 생각했다.
  • 즉, 밑에서 올라갈때는 두 개의 수는 위 행의 하나의 수로 귀결된다. 이때 위 행의 수와 합쳐서 더 큰 수를 더해가면 된다.
  • 그렇게 되면 위에서 더 크게 더해지는 수들이 올라 오다보면 결국 첫째항은 최대 값이 나오게된다.
  • 이번 문제를 통해 또 재미난 알고리즘을 배우게 되었다.
Best Code
for (int i = p.length - 1; i >= 1; i--)
    for (int j = 0; j < i; j++)            
        p[i - 1][j] += Math.max(p[i][j], p[i][j + 1]);

return p[0][0];