-
[ 프로그래머스 ] 정수 삼각형 (JAVA )자료구조 & 알고리즘/Programmers 2022. 6. 12. 19:20
https://programmers.co.kr/learn/courses/30/lessons/43105
코딩테스트 연습 - 정수 삼각형
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30
programmers.co.kr
📌 문제
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
📌 제한 사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
📌 풀이
📍 DP 를 통한 풀이
- 메모이제이션 형태
- 이차원 배열
- 점화식
- 기본 아이디어를 통한 점화식 설명
- dp[row][colum] = max(dp[ row -1 [ colum -1 ] , dp[ row-1 ][ colum ]) + triangle[row][colum]
- 모든 위치에 대해 검사하되, 어떤 줄기에서 선택되어 내려왔을 때 최대값을 가질 수 있는지를 확인
- 현재 위치에서 도달 했을때 오른쪽 위에서 내려 오는것 혹은 왼쪽 위에서 내려오는것 중 누적 큰값을 내는 것을 선택
- 상세 점화식
- 가장 왼쪽 값
- dp[row][colum] = dp[ row-1 ] [ colum -1 ] + triangle[row][colum]
- 가장 왼쪽을 통해서 내려오는 방법 밖에는 없음
- 가장 오른쪽 값
- dp[row][colum] = dp[ row-1 ] [ colum ] + triangle[row][colum]
- 가장 오른쪽을 통해서 내려오는 방법 밖에는 없음
- 그외 (중간)
- dp[row][colum] = max(dp[ row -1 [ colum -1 ] , dp[ row-1 ][ colum ]) + triangle[row][colum]
- 가장 왼쪽 값
- 기본 아이디어를 통한 점화식 설명
- 그외 포인트
- dp 문제를 풀다 보면 특히 배열을 많이 다루게 되고 NPE 를 많이 경험하게된다. 포문의 범위, 경계값에 대해 잘 생각해보자
import java.util.*; import static java.lang.Math.*; class Solution { public int solution(int[][] triangle) { int[][] dp = new int[triangle.length][triangle.length]; dp[0][0] = triangle[0][0]; for (int i = 1; i < triangle.length; i++) { for (int j = 0; j < i+1; j++) { if (j == 0) dp[i][j] = triangle[i][j] + dp[i - 1][j]; else if(j == triangle[i].length-1) dp[i][j] = triangle[i][j] + dp[i - 1][j-1]; else { dp[i][j] = triangle[i][j] + max(dp[i - 1][j - 1], dp[i - 1][j]);} } } int maxValue = 0; for (int i = 0; i < dp.length; i++) { maxValue = max(maxValue, dp[dp.length - 1][i]); } return maxValue; } }
'자료구조 & 알고리즘 > Programmers' 카테고리의 다른 글
[ 프로그래머스 ] 가장 먼 노드 (Kotlin ) (0) 2022.08.05 [ 프로그래머스 ] 섬 연결하기 (Kotlin ) (0) 2022.06.06 [ 프로그래머스 ] 더 맵게 (java) (0) 2022.05.04