공부 일지/문제풀이

[프로그래머스] 정수 삼각형(JAVA)

Joshbla 2023. 4. 8. 18:35

코딩테스트연습(동적계획법) - 정수 삼각형

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/43105

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

삼각형의 꼭대기에서 시작하여 오른쪽아래 또는 왼쪽아래로 차례로 내려가면서 바닥까지 내려간다.

그 경로에서 거쳐간 숫자의 합이 가장 큰 경우 그 합을 구하는 문제이다.

삼각형의 높이는 1~500이다.

삼각형을 이루고 있는 숫자는 0~9999이다.


문제 풀이

생각 과정

우선 정답배열과 임시배열을 만드는데 그 길이는 삼각형의 최하단의 길이만큼 설정한다.

그리고 삼각형의 최상단에서부터 차례로 내려오면서 정답배열에 넣어주면서 갱신한다.

최상단은 기본으로 넣어주고 

그 다음부터는 좌상단과 우상단 중 큰 값을 넣는다.

이런 과정을 끝까지 반복하면 

각 경로에 따른 숫자의 합은 아래와 같다.

이 중 가장 큰 25가 정답이 된다.

구현

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int[] arr = new int[triangle[triangle.length - 1].length];
        
        for (int i = 0; i < triangle.length; i++) {
            int[] temp = new int[triangle[triangle.length - 1].length];
            for (int j = 0; j < triangle[i].length; j++) {
                if (j == 0) {
                    temp[j] = arr[j] + triangle[i][j];
                } else if (j == arr.length - 1) {
                    temp[j] = arr[j - 1] + triangle[i][j];
                } else {
                    temp[j] = triangle[i][j] + Math.max(arr[j], arr[j - 1]);
                }
            }
            arr = temp;
        }
        
        for (int i = 0; i < arr.length; i++) {
            answer = Math.max(answer, arr[i]);
        }
        
        return answer;
    }
}