공부/2024 항해99코딩클럽
99클럽 3기 코테 스터디 21일차 TIL /[프로그래머스] 정수 삼각형 자바 풀이, 동적계획법
푸딩코딩
2024. 8. 11. 21:34
728x90
반응형
1. 오늘의 학습 문제
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43105
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명

위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
코드
*틀린 코드
import java.util.*;
class Solution {
static int answer=-1;
static int[] level_max;
public int solution(int[][] triangle) {
level_max = new int[triangle.length]; //레벨별로 최대합 저장 메모라이제이션
Tri(triangle, 0, 0, 0);
return answer;
}
public void Tri(int[][] triangle, int i, int k, int now){
now+=triangle[i][k];
if(i==triangle.length-1){
answer = Math.max(answer, now);
level_max[i]=answer;
}
else if(now>level_max[i]){
level_max[i]=now;
Tri(triangle, i+1, k, now);
Tri(triangle, i+1, k+1, now);
}
}
}
메모이제이션을 사용하고자했는데, 틀렸다. 효율성도 실패.
재귀적 방법인데, 복잡도가 높다.
저장하는 것은, 레벨별 합의 최대인데, 이렇게 되면 중복되는 계산이 생긴다.
따라서 풀이를 찾아 보았다.
import java.util.*;
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
int height = triangle.length; // 삼각형 높이
int[][] dp = new int[height][height]; // 합 기록할 배열
// 가장 왼쪽 단계는 미리 저장
dp[0][0] = triangle[0][0];
for(int i = 1; i < height; i++) {
dp[i][0] = dp[i-1][0] + triangle[i][0];
}
// 위에서부터 높이 하나씩 내려가면서 최대값 구하기
for(int i = 1; i < height; i++) {
for(int j = 1; j < triangle[i].length; j++) {
// 왼쪽 위에서 내려와 더했을 때, 오른쪽 위에서 내려와 더했을 때 중 최대값 저장
dp[i][j] = Math.max(dp[i-1][j-1] + triangle[i][j], dp[i-1][j] + triangle[i][j]);
}
}
// 삼각형의 바닥에서 가장 큰 값 구하기
for(int i = 0; i < height; i++) {
answer = Math.max(dp[height - 1][i], answer);
}
return answer;
}
}
2. 오늘의 회고
- 접근은 좋았는데, 아쉬웠다. DP 문제를 더 풀어보자
#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL
728x90
반응형