반응형
https://programmers.co.kr/learn/courses/30/lessons/42895?language=cpp
N은 8번까지만 사용하면 됩니다. 그 이상은 -1을 반환해주면 됩니다.
만약 N이 3이라면,
1번 사용하는 경우 -> 3
2번 사용하는 경우 -> 33
3번 사용하는 경우 -> 333
4번 사용하는 경우 -> 3333
5번 사용하는 경우 -> 33333
6번 사용하는 경우 -> 333333
7번 사용하는 경우 -> 3333333
8번 사용하는 경우 -> 33333333
위와 같이 8개의 경우로 나누어서 저장해줍니다.
N을 2번 사용하는 경우 -> ((N을 1번 사용하는 경우) (+-*/) (N을 1번 사용하는 경우))
N을 3번 사용하는 경우 -> ((N을 1번 사용하는 경우) (+-*/) (N을 2번 사용하는 경우))
((N을 2번 사용하는 경우) (+-*/) (N을 1번 사용하는 경우))
N을 4번 사용하는 경우 -> ((N을 1번 사용하는 경우) (+-*/) (N을 3번 사용하는 경우))
((N을 2번 사용하는 경우) (+-*/) (N을 2번 사용하는 경우))
((N을 3번 사용하는 경우) (+-*/) (N을 1번 사용하는 경우))
... 처럼 될 것입니다.
dp[i]는 N을 i번 사용하는 경우의 수 집합이라고 하면,
dp[i] = { dp[1] (+-*/) dp[i -1],
dp[2] (+-*/) dp[i -2],
dp[3] (+-*/) dp[i -3], .... } 입니다.
#include <string>
#include <vector>
using namespace std;
int cal(int a, int b, int t) {
if(t == 0) return a + b;
else if(t == 1) return a - b;
else if(t == 2) return a * b;
else {
if(b > 0) return a / b;
}
return -1;
}
int solution(int N, int number) {
if(N==number) return 1;
vector<int> dp[8];
dp[0].push_back(N);
for(int i=1; i<8; i++) {
int val = dp[i-1][0]*10 + N;
if(val == number) return i+1;
dp[i].push_back(val);
}
for(int i=1; i<8; i++)
for(int j=0; j<=i-1; j++)
for(int k=0; k<dp[j].size(); k++)
for(int l=0; l<dp[i-1-j].size(); l++)
for(int m=0; m<4; m++) {
int val;
if((val = cal(dp[j][k], dp[i-1-j][l], m)) == number) return i+1;
if(val != -1) dp[i].push_back(val);
}
return -1;
}
반응형
'Algorithm' 카테고리의 다른 글
프로그래머스 : 단속카메라 (0) | 2021.11.13 |
---|---|
프로그래머스 : 가장 먼 노드 (0) | 2021.11.13 |
프로그래머스 : 스킬트리 (0) | 2021.11.13 |
프로그래머스 : 프린터 (0) | 2021.11.13 |
프로그래머스 : 기능개발 (0) | 2021.11.13 |