문제
https://school.programmers.co.kr/learn/courses/30/lessons/118668
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
알고력 코딩력을 증가시키는 방법은 3가지이다.
1.알고리즘을 공부 -> 알고력+1
2. 코딩을 공부 -> 코딩력 +1
3. 문제를 풀면 -> 알고력 +n, 코딩력 +n
3가지 경우의 수로 db를 이용해서 풀면된다.
처음주어진 알고력과 코딩력이 문제를 풀기위해 필요한 알고력과 코딩력보다 높을 수 있기 때문에
for문의 인덱스를 둘중의 더 작은 값으로 설정한다.
#include <string>
#include <vector>
using namespace std;
vector<vector<int>>dp(181,vector<int>(181,1000000));
int alp_p,cop_p,t;
int solution(int alp, int cop, vector<vector<int>> problems) {
int answer = 0;
int pb_size = problems.size();
int alp_max=0,cop_max=0;
for(int i = 0;i<pb_size;i++){
alp_max = max(alp_max, problems[i][0]);
cop_max = max(cop_max, problems[i][1]);
}
//alp > alp_max, cop>cop_max일 수 있음
dp[alp][cop]=0;
dp[min(alp_max,alp)][cop]=0;
dp[alp][min(cop_max,cop)]=0;
dp[min(alp_max,alp)][min(cop_max,cop)]=0;
//시작 인덱스를 min(alp_max,alp) 로 지정
for(int i=min(alp_max,alp);i<=alp_max;i++){
for(int j=min(cop_max,cop);j<=cop_max;j++){
//알고리즘 공부해서 알고력 +1
dp[i+1][j] = min(dp[i+1][j],dp[i][j]+1);
//코딩공부해서 코딩력 +1
dp[i][j+1] = min(dp[i][j+1],dp[i][j]+1);
//문제 풀어서 둘다 +n (n>=0)
for(int k=0; k < pb_size ;k++){
//현재 알고력과 코딩력으로 풀 수 없는 문제는 스킵
if(problems[k][0]>i || problems[k][1]>j)
continue;
alp_p = problems[k][2];
cop_p = problems[k][3];
int x=min(i+alp_p, alp_max);
int y =min(j+cop_p, cop_max);
dp[x][y] = min(dp[x][y] , dp[i][j]+ problems[k][4] );
}
}
}
return answer= dp[alp_max][cop_max];
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 같은 숫자는 싫어 c++ (0) | 2023.11.29 |
---|---|
[프로그래머스] 이모티콘 할인행사 c++ (1) | 2023.11.25 |
[프로그래머스] 숫자 문자열과 영단어 c++ (0) | 2023.11.23 |
[프로그래머스] 하노이의 탑 c++ (0) | 2023.11.11 |
[프로그래머스] 포켓몬 c++ (0) | 2023.11.07 |