알고리즘/99Club
99클럽 코테 스터디 21일차 TIL + Java Algorithm
dami97
2024. 8. 11. 17:49
반응형
소개
- 알고리즘 스터디를 참여하며 작성하는 TIL입니다.
- TIL이란? 'Today I Learned'의 약자로, 한국어로 번역하면 '오늘 내가 배운 것'이란 의미입니다.
- 제가 오늘 하루 배운 것 혹은 경험하고 느낀 것들을 기록하고 회고하는 습관을 기르기 위한 글입니다.
문제 & 키워드
- 프로그래머스 - 정수 삼각형 (문제 링크)
- 동적 계획법 (Dynamic Programming)
- 최댓값 경로 찾기
문제 설명
주어진 삼각형 형태의 배열에서 꼭대기에서부터 바닥까지 내려가며 거쳐간 숫자의 합이 가장 큰 경로를 찾는 문제입니다. 이동할 때는 아래 칸으로 이동하며, 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동이 가능합니다.
제한사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
triangle | result |
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
문제 설명
위의 삼각형에서 최댓값 경로를 예로 들면, 경로는 7 -> 3 -> 8 -> 7 -> 5를 선택하여 합이 30이 됩니다.
문제 접근
이 문제는 동적 계획법(DP)을 사용하여 해결할 수 있습니다. DP는 큰 문제를 작은 문제로 나누어 해결하며, 이전 단계의 최적 결과를 이용해 현재 단계의 최적 결과를 구하는 방식입니다.
- 삼각형 초기화
- 주어진 삼각형 배열을 이용해 각 위치에서 가능한 최댓값을 저장해 나갑니다.
- 최댓값 계산
- 첫 번째 행부터 시작하여 각 위치에서 선택 가능한 왼쪽 위 또는 오른쪽 위 값 중 더 큰 값을 선택하여 현재 위치의 값을 갱신합니다.
- 갱신된 값은 그 위치까지의 최댓값이 됩니다.
- 결과 반환
- 마지막 행에서 가장 큰 값을 반환하여 전체 경로의 최댓값을 구합니다.
풀이 - 동적 계획법
class Solution {
public int solution(int[][] triangle) {
// 삼각형의 각 위치에서의 최댓값을 계산
for (int i = 1; i < triangle.length; i++) {
for (int j = 0; j < triangle[i].length; j++) {
// 가장 왼쪽의 경우 위에서 내려올 수 있는 경로는 하나
if (j == 0) {
triangle[i][j] += triangle[i - 1][j];
// 가장 오른쪽의 경우도 위에서 내려올 수 있는 경로는 하나
} else if(j == triangle[i].length - 1){
triangle[i][j] += triangle[i - 1][j - 1];
// 그 외의 경우, 왼쪽 위와 오른쪽 위 중 큰 값을 선택
}else {
int left = triangle[i - 1][j - 1];
int right = triangle[i - 1][j];
triangle[i][j] += Math.max(left, right);
}
}
}
// 마지막 행에서 가장 큰 값 찾기
int answer = 0;
int lastIndex = triangle.length - 1;
for (int cost : triangle[lastIndex]) {
answer = Math.max(answer, cost);
}
return answer;
}
}
풀이 설명
- 삼각형 초기화 및 갱신
- 삼각형의 첫 번째 행을 제외한 각 행에 대해 왼쪽 위와 오른쪽 위에서 내려올 수 있는 경로 중 더 큰 값을 선택해 현재 위치의 값을 갱신합니다.
- 가장 왼쪽의 값과 가장 오른쪽의 값은 각각 한 경로만 가능하므로, 해당 경로를 더해줍니다.
- 최댓값 계산
- 마지막 행에서 가장 큰 값을 선택하여 최종 경로의 최대 합을 구합니다.
- 결과 반환
- 마지막 행에서 가장 큰 값을 반환하여 문제에서 요구한 최댓값 경로의 합을 반환합니다.
마무리하며
- 이번 문제를 통해 동적 계획법(DP)의 기초적인 개념을 활용하여 문제를 해결하는 방법을 익혔습니다.
- 삼각형의 각 위치에서 가능한 최댓값을 계산하고 이를 누적하여 최종 결과를 도출하는 과정으로 문제를 해결했습니다.