본문 바로가기
공부/2024 항해99코딩클럽

99클럽 3기 코테 스터디 21일차 TIL /[프로그래머스] 정수 삼각형 자바 풀이, 동적계획법

by 푸딩코딩 2024. 8. 11.
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 이하의 정수입니다.
입출력 예triangleresult
[[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
반응형