프로그래머스 LV3 - 정수 삼각

이은엽·2023년 10월 13일
0

algorithm

목록 보기
5/7

문제설명

삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

제한 사항

  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

입출력 예

triangle
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]

result
30

문제풀이

  • 밑에서부터 둘 중 큰 수를 만들어 그 위에 숫자에 더한다.
  • 이와 같은 방식을 계속 이어나가면서 맨 위 숫자를 출력

풀이 방법

  • 맨 밑줄은 값이 그대로 가면서 3번째 줄부터 더하기로 올라가는 것이므로 i 값을 triangle.length-2부터 시작
  • 그럼 3번째 줄의 양 쪽 숫자중 큰 숫자를 더하게 된다.
  • 3번째 숫자의 숫자가 전부 바뀌고 똑같은 방식으로 위에 숫자를 더해가면서 for문을 수행한다.
  • for문 수행이 끝나면 triangle[0][0]의 값을 출력한다면 가장 큰 값 실행

첫번째 풀이

import java.util.*;
class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        for(int i = triangle.length-2; i >= 0; i--){
            for(int j = 0; j < triangle[i].length; j++){
                triangle[i][j] += Math.max(triangle[i+1][j], triangle[i+1][j+1]);
            }
        }
        answer = triangle[0][0];
        return answer;
    }
}

배운점

  • 처음에는 위에서 전체 다 수행하여 가장 작은 값을 찾아내는 dfs를 사용하려고 함
  • 프로그래머스 문제 유형이 dp유형이라서 점화식 방식을 생각했다
  • 생각해보니 밑에서부터 풀면 된다고 알게되었다
  • 역시... 문제는 바로 보이는대로 dfs로 풀어야지!보다는 어떤 방식으로 풀면 더 빠를까를 어느정도 시간을 두고 생각하고 푸는게 좋을 것 같다
  • 근데 사실 이것도 3레벨이라고 봐야하나..? 싶다

문제풀이 주소

https://school.programmers.co.kr/learn/courses/30/lessons/43105

0개의 댓글