문제풀이/프로그래머스
[프로그래머스] 정수 삼각형
Hyeon-Uk
2021. 3. 3. 15:16
반응형
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문제이다. 삼각형을 2차원 배열로 설정하기 까다로우니 좌측으로 몰았다
v
vv
vvv
vvvv
vvvvv
이런식으로 좌측으로 몰아서 인덱싱을 하니 간편했다.
dp[i][j]= i번째 높이(위에서 부터 0,1,2,....)에서 j번째 위치까지 오는데 걸리는 최대 합이다
따라서 dp[i][j]는 바로 위의 dp[i-1][j]과 dp[i-1][j-1]두개중 큰것과 자기 자신의 값을 더해주면 되는데
각 줄의 처음은 dp[i-1][j]만 고려해주면되고, 마지막은 dp[i-1][j-1] 만 고려해주면 되는 문제이다.
수행시간)
모든 원소를 다 돌아다니므로, 1+2+3+4+5+6+...+n 이 된다. (n=높이)
이것은 h*(h+1)/2 가 되므로, 수행시간은 O(n*n) 이 된다.
코드)
#include <string>
#include <vector>
#include<algorithm>
using namespace std;
int dp[500][500]={0};
int solution(vector<vector<int>> triangle) {
int answer = 0;
//맨 꼭대기 dp초기화
dp[0][0]=triangle[0][0];
for(int i=1;i<triangle.size();i++){
for(int j=0;j<triangle[i].size();j++){
//각 줄의 처음 원소
if(j==0){
dp[i][j]=triangle[i][j]+dp[i-1][j];
}
//각 줄의 마지막 원소
else if(j==triangle[i].size()-1){
dp[i][j]=triangle[i][j]+dp[i-1][j-1];
}
else{
dp[i][j]=triangle[i][j]+max(dp[i-1][j],dp[i-1][j-1]);
}
}
}
//마지막 줄을 돌아다니며 최대값 찾음
int ind=triangle.size()-1;
answer=*max_element(dp[ind],dp[ind]+ind+1);
return answer;
}
실행결과)
반응형