ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 정수 삼각형
    문제 풀이 2020. 6. 12. 16:35
    문제 설명

    스크린샷 2018-09-14 오후 5.44.19.png

    위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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


    풀이)

    dfs를 이용하면 시간초과가 나는 문제로, dp를 사용해서 풀어야한다.


    int dp[500][500];

    //dp[i][j] :삼각형의 높이가 i일때의 j번째 숫자와 높이 i-1의 j-1, j번째 숫자 중 큰 숫자와 합친 값 


    삼각형 꼭대기에서부터 아래로 갈 때 이전에 계산된 값 중 큰 값을 합치는 방식이다.(top-down)

    이런 식으로 저장되어서 마지막 층 값 중 가장 큰 값을 고르면 된다.


    주의

    삼각형의 정보가 주어질 때, 배열로 주어지다보니 높이가 5라면 아래와 같이 15개의 숫자 정보가 주어진다.

    그러므로 dp에 저장할때는 화살표 방향대로 저장하면된다.

    ex) 위치 5의 dp값 = 위치 5의 숫자 값 + 위치 2와 3에 있는 숫자 값 중 큰 값 


    결과는 위치 11,12,13,14,15 의 값 중 큰 값 반환.


    코드)

    #include <string> #include <vector> using namespace std; int dp[500][500]; int solution(vector<vector<int>> triangle) { int answer = 0; for(int i=0;i<triangle.size();i++){ for(int j=0;j<triangle[i].size();i++){ dp[i][j] =0; } } dp[0][0] = triangle[0][0]; for(int i=1;i<triangle.size();i++){ for(int j=0;j<triangle[i].size();j++){ int left = j-1; if(left <0) left = 0; if(dp[i-1][left] + triangle[i][j] > dp[i-1][j] + triangle[i][j]){ dp[i][j] = dp[i-1][left] + triangle[i][j]; }else{ dp[i][j] = dp[i-1][j] + triangle[i][j]; } if(i==triangle.size()-1){ if(answer < dp[i][j]) answer = dp[i][j]; } } } return answer; }



    댓글

Designed by Tistory.