지식의모듈화

[Level2][Javascript] N으로 표현 본문

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의 개수로 정의해서 잘 풀 수 없었다.