🚀 [N으로 표현] Lv. 3 문제
N과 사칙연산 만으로 Number를 표현할 수 있는 것 중 최소한의 N을 사용한 수를 출력하는 문제입니다.
N을 사용하여 표현 할 수 있는 모든 값을 vector[N]에 저장하고 이전 벡터 값들을 통해 vector[N] 을 채워나가며 문제를 해결합니다.
중복을 방지하기 위해 set을 사용하였습니다.
💎 전체 코드는 다음과 같습니다.
#include <string>
#include <vector>
#include <iostream>
#include <set>
using namespace std;
// DP 로 해결한다.
int solution(int N, int number) {
if(N == number) return 1;
// set을 사용하여 값의 중복을 막는다.
vector<set<int> > vec(9);
// N을 하나만 사용하면 N만 된다.
vec[1].insert(N);
string Nstring = to_string(N);
// 모든 벡터에 N을 덫 붙인 숫자를 더해준다.
// ex) N이 5이면 1 -> 5, 2-> 55, 3-> 555
for(int i=2; i<9 ; i++){
Nstring += to_string(N);
vec[i].insert(stoi(Nstring));
}
// 이전 벡터의 값들을 사칙연산을 통해 계산해 현재 식에 저장.
for(int i=2; i<9; i++){
for(int j=1; j<=i; j++){
for(set<int>::iterator it = vec[j].begin(); it!=vec[j].end(); it++){
for(set<int>::iterator it2 = vec[i-j].begin(); it2!=vec[i-j].end(); it2++){
vec[i].insert((*it) + (*it2));
vec[i].insert((*it) - (*it2));
vec[i].insert((*it) * (*it2));
if(*it2 != 0)
vec[i].insert((*it) / (*it2));
}
}
}
if(vec[i].find(number) != vec[i].end()) return i;
}
return -1;
}
Comments