알고리즘 문제풀이

프로그래머스 level 3 - 정수 삼각형(Javascript)

승큐니 2023. 10. 28. 16:37

정수 삼각형

문제 설명

스크린샷 2018-09-14 오후 5.44.19.png

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

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

제한사항

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

입출력 예

triangle result
7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5 30

나의 풀이

동적 계획법의 가장 중요한 요소는 불필요한 계산을 줄이는데 있다.
코드가 재사용될 수 있도록 trianlge과 같은 형태의 이중 배열을 생성하고, 각 원소에 해당 위치까지 오는 경로의 합 중 최대값을 부여하고, 이를 토대로 다음 행의 원소도 채워갈 수 있다.

function solution(triangle) {
	// triangle과 같은 형태의 이중배열 dp를 만들어준다.
    const dp = [...Array(triangle.length)].map((v, index)=>[...Array(index+1)].map(()=>0));
    // 0번 행은 triangle[0] 행과 일치함
    dp[0][0] = triangle[0][0];
	
	// 각 층의 dp를 채우는 함수
	// 각 행의 첫번째, 마지막 원소에 대해 예외처리를 해주고,
	// 나머지 원소는 상위 두 수 중 큰 값에 구하려는 위치에 있는 triangle[i][j]을 더해준다.
    function dpFunc(n){
        if(n === 0) return;
        for(let i = 0; i < dp[n].length; i++){
            if(i === 0){
                dp[n][i] = dp[n-1][i] + triangle[n][i];
            }
            else if(i === dp[n].length - 1){
                dp[n][i] = dp[n-1][i-1] + triangle[n][i];
            }
            else {
                dp[n][i] = Math.max(dp[n-1][i-1], dp[n-1][i]) + triangle[n][i];
            }
        }
    }
    // 1번 행부터 각 행을 함수를 통해 채우고
    for(let i = 1; i < triangle.length; i++){
        dpFunc(i)
    }
    // 마지막 행의 최대값을 값으로 리턴한다.
    const max = Math.max(...dp[triangle.length - 1])
    return max;
}