[프로그래머스/Java] 정수 삼각형 풀이

은엽·2023년 11월 2일

문제풀이

목록 보기
18/33

⚠Problem

https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=java

위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

제한사항

  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

solution

꼭대기부터 바닥까지 이어지는 경로의 최댓값을 순서대로 구하는 바텀업 방식으로 풀이했다. 문제에서 주어지는 배열은 보기에는 삼각형이지만 실제로는 높이가 h일 때 1 ~ h 길이의 배열로 이루어져있다. 따라서 경로(i, j)의 최댓값을 구하는 점화식을 작성하면 triangle[i][j] = max(triangle[i - 1][j - 1], triangle[i - 1][j])가 된다. 맨 앞에 있는 값이나 맨 뒤에 있는 값은 지나쳐올 수 있는 경로가 정해져있으므로 따로 처리해주면 된다. 맨 앞에 있는 값은 이전 경로의 맨 앞만 지나쳐올 수 있고 맨 뒤에 있는 경로는 이전 경로의 맨 뒤만 지나쳐올 수 있다. 코드 상으로는 삼항 연산자로 구현해주었다.

Java Code

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        for (int i = 1; i < triangle.length; i++) {
            for (int j = 0; j < triangle[i].length; j++) {
                triangle[i][j] += Math.max(
                    j > 0 ? triangle[i - 1][j - 1] : 0, j < triangle[i].length - 1 ? triangle[i - 1][j] : 0);
                if (i == triangle[i].length - 1) answer = Math.max(answer, triangle[i][j]);
            }
        }
        return answer;
    }
}
profile
어떻게 했더라

0개의 댓글