문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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;
}
'알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 level 2 - 마법의 엘리베이터(Javascript) (0) | 2023.11.06 |
---|---|
프로그래머스 level 2 - 리코쳇 로봇(Javascript) (1) | 2023.11.02 |
프로그래머스 - 게임 맵 최단거리(DFS, BFS) (0) | 2023.09.05 |
프로그래머스 - 카펫(완전탐색) (0) | 2023.09.02 |
프로그래머스 - 모의고사(완전탐색) (0) | 2023.09.02 |