-
반응형
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; }
실행결과)
반응형'문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 2 x n 타일링 (0) 2021.03.21 [프로그래머스] 등굣길 (0) 2021.03.06 [프로그래머스] 같은 숫자는 싫어 (0) 2020.11.24 [프로그래머스] 3진법 뒤집기 (0) 2020.11.24 [프로그래머스] 가운데 글자 가져오기 (0) 2020.11.24 댓글