PS/프로그래머스
[Level2][Javascript] N으로 표현
returnzero
2022. 6. 25. 22:00
DP문제인데, 아직 풀지 못했다.
function solution(N, number) {
var answer = 0;
let DP=[];
DP[N]=1;
DP[0]=2;
for (let i=1; i<N;i++){
DP[i]=i+1;
}
for(let i=N+1; i<=number;i++){
let remain= (i%N);
let a;
if( remain){ /// N =5, i=8 , 1+DP[1]+DP[3]
a=DP[Math.floor(i/N)]+1+DP[remain]
}
else{ // N=5, i=5, 1+DP[1]
a=DP[Math.floor(i/N)]+1
}
DP[i]=Math.min(a, 1+DP[i-5])
}
console.log(DP);
return answer;
}
// N=5
// f(N)=1;
// f(N*0+1)=2
// f(N*0+2)=3 / 5+5/5
// f(3)=4
// f(4)=5
// f[50]= (f[10] +1, f[45]+1)
// f(10)= (f(2)+1, f(5)+1)
// f(2)= f(2)
// function dp(a,N){
// dp(a)
// }
//2022-06-26
function solution(N, number) {
var answer =-1;
let DP=[];
let Q={};
Q[N]=1;
DP[1]= Q; //N1개 사용
// DP[2]={N/N:1, N+N:1, N-N:1, N*N:1, N+N:1 }; // N/N, N+N
// DP[3]=
for (let i=2; i<=8;i++){
let Q={};
let NNs=0;
for (let k=0; k<i;k++){
NNs+=Math.pow(10,k)*N;
}
Q[NNs]=1;
for (let k=1; k<=i/2;k++){
let keyA= Object.keys(DP[i-k]).map(e=>Number(e));
let keyB = Object.keys(DP[k]).map(e=>Number(e));
for(let i=0; i<keyA.length;i++){
for(let j=0; j<keyB.length;j++){
let sum= keyA[i]+keyB[j]
let dif= Math.abs(keyA[i]-keyB[j])
let mul= keyA[i]*keyB[j]
let div = Math.floor(keyA[i]/keyB[j])
if (sum<=32000) Q[sum]=1;
if (dif<=32000) Q[dif]=1;
if (mul<=32000) Q[mul]=1;
if (div<=32000) Q[div]=1;
}
}
}
// keys.forEach((e,i)=>{
// e=Number(e)
// Q[e+N]=1;
// if((e-N)>0)Q[e-N]=1;
// Q[Math.floor(e/N)]=1;
// Q[e*N]=1;
// })
DP[i]=Q;
}
// console.log(DP)
for (let i=1; i<DP.length;i++){
if(DP[i][number]>0){
answer=i;
break;
}
}
return answer;
}
풀었다... DP array안에 들어갈 것들을 잘 정의하자.. bottom-up 접근은 맞았는데 DP[i] 를 숫자 i를 만들 때 필요한 최소 number의 개수로 정의해서 잘 풀 수 없었다.