-
[프로그래머스] 정수 삼각형문제 풀이 2020. 6. 12. 16:35
문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
triangle result [[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; }
'문제 풀이' 카테고리의 다른 글
[백준] 2616번 소형기관차 (2) 2020.06.24 [백준] 1074번 Z (0) 2020.06.23 [프로그래머스] 징검다리 건너기 (0) 2020.06.11 [프로그래머스] 기지국 설치 (0) 2020.06.11 [프로그래머스] 올바른 괄호의 개수 (0) 2020.06.10