-
[프로그래머스] DP(3) 정수 삼각형알고리즘/알고리즘 풀이 2020. 1. 15. 18:08
문제 풀이
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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 풀이
#include <string> #include <vector> #include <iostream> using namespace std; int solution(vector<vector<int>> triangle) { int answer = 0; vector<vector<int>> temp(triangle.size(),vector<int>(triangle.size())); // 벡터 크기 동적 할당 temp[0][0] = triangle[0][0]; for (int i = 1; i < triangle.size(); i++) { for (int j = 0; j <= i; j++) { // 왼쪽 가장자리일 때 윗 노드 영향만 받음 if (j == 0) temp[i][j] = temp[i - 1][j] + triangle[i][j]; // 오른쪽 가장자리일 때 윗 노드 영향만 받음 else if (j == i) temp[i][j] = temp[i - 1][j - 1] + triangle[i][j]; // 가장자리가 아닌 노드 else { temp[i][j] = max(temp[i - 1][j - 1] + triangle[i][j], temp[i - 1][j] + triangle[i][j]); } // 마지막 줄에서 가장 큰 값 추출 if (i == triangle.size() - 1) answer = max(answer, temp[i][j]); } } return answer; }
dfs로 풀다가 다른 사람의 풀이를 보았다.
triangle[i][j] 에 triangle[i-1][j-1], triangle[i-1][j] 중의 최댓값을 더해나가는 방식이다.
양 끝 가장자리의 노드는 길이 두 갈레로 나뉘지 않고 바로 밑으로 값이 내려오기 때문에
if 문으로 예외처리를 해준다.
가운데 노드는 둘 중 max값을 받아 더하도록 한다.
해당 과정을 트리의 높이까지 했다면 최종 노드에 각 갈레에서의 최댓값을 저장하게 된다.
그 중 max를 통해 최종 answer를 구한다.
.
.
다시 한번 풀어보도록 하자!
해당 문제 링크
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
'알고리즘 > 알고리즘 풀이' 카테고리의 다른 글
[프로그래머스] DP(4) 등굣길 (0) 2020.01.16 피보나치수열 알고리즘 (재귀, DP, 반복) (0) 2020.01.13 [프로그래머스] DP(2) 타일 장식물 (0) 2020.01.13 댓글