ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 Node.js/Javascript] 2839번 설탕 배달
    To infinity/Coding Practice 2021. 7. 3. 12:19

    2021.07.02 - 03

     

     

    Problem

     

    2839번: 설탕 배달

    상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

    www.acmicpc.net

     

    How to Solve?

     

     

    문득, 이런 생각이 들었다.

     

    내가 실제로 현업에서 일을하게되면 백준에서와 같이 내가 짠 코드가 정답인지 아닌지 걸러주지 않고 실제로 내가 여러 조건들을 넣어보면서 판별을 하게 될텐데 어떻게 그걸 판별할 수 있을까?

     

    오류횟수를 최대한 줄어야 한다는 생각이 들었다.

     


     

    이번 문제는 반은 풀고 반은 못 풀었다고 해도 될 것 같다.

    일단, '나머지'라는 개념을 통해 해당 문제를 접근하면 되겠다는 아이디어는 얻었다.

     

    하지만 내가 봉착한 문제는 그래서 그걸 어떻게 구현할건데?였다.

    현재까지 문제를 풀면서 정답을 '맞추는게' 중요한게 아니라 어떻게 문제를 '푸는가'라는 생각이 들었다. 단순히 좋아보이는 코드 몇개 복붙해서 '맞았습니다'를 받는건 의미가 없다. 왜냐면 단순히 흉내낸 것에 불과하니까.

     

    그래서 일단은 단순무식해보여도 내가 생각했던 아이디어를 일일이 나열하고 해당 아이디어가 맞았다면 그 다음에 식을 효율적으로 만드는 작업을 하는 것이 좋다는 생각이 들었다.

     

     

    // 부끄럽지만 적나라게.
    // 해당코드는 동작하지 않는다.
    
    let N = 4;
    let sugar = [];
    
    let package = [3, 5, 8]
    for ( let i = 0; i < package.length; i++ ) {
        let idx = package[i]
    
        if( N % idx  == 0 ) sugar.push(parseInt(N/3))
        else if( N % idx  == 0 )  sugar.push(parseInt(N/5))
        else if( N % idx  == 0 )  sugar.push(parseInt(N/8))
        else if(( N % idx ) % 3 == 0 )  sugar.push(parseInt( N / 5 ) + parseInt( ( N % 5 ) / 3 ))
        else if(( N % idx ) % 5 == 0 )  sugar.push(parseInt( N / 5 ) + parseInt( ( N % 3 ) / 5 ))
        else sugar.push(0)
    }
    
    if(sugar == 0) console.log(-1)
    else { console.log(Math.min.apply(null, sugar)) }

     

     

    N의 값이 3과 5와 8로 나누어 떨어진다면 그 몫을 구하면 된다고 생각했다. 하지만 내가 구하려는건 '3kg와 5kg로 구성이 되느냐?'가 아니라 '3kg 와 5kg로 이뤄진 최소값'이기 때문에 만약 8의 배수로 이뤄졌을 때의 봉지수는 어떻게 구할지도 생각해야했다. 그리고 해당 조건까지 넣기에는 식이 너무 번잡하고 많아진다.

     

    게다가 만약 답이 없을 때에는 -1을 출력해야하는데 해당 부분도 생각을 못했다.

    전체를 보고 접근해야하는데 단순히 3과 5로 이뤄지는지 파악하는데만 급급해서 국소적인 코드를 짜버린 것이다.

    즉, 문제 무엇을 원하는지를 '정확하게' 파악을 못한 것이다.

     


     

    let N = 91;
    let result = 0;
    
    //가장 작은 수를 구해야하니까 5kg을 먼저 뺀다.
    
    if( N % 5 == 0) {
    
        result = parseInt( N / 5 )
    
    } else if (N % 5 > 0 && N % 5 == 3) {
    
        result = parseInt( N / 5 ) + 1
    
    } else if (N % 3 == 0) {
    
        result = parseInt ( N / 3 )
    
    } else result = -1
    
    console.log(result);
    
    //더하기로 나올 수 있는 값이 있다. '19'
    /*아.. 가장 작은 봉지수를 구해햐 하니까 5kg으로 먼저 나눠보고,
    만약 나눠지면 5kg으로 모두 채우고, 그렇지 않다면 3kg으로 채운다.
    (즉, 3kg을 하나 뺀다.) 그리고 다시 5로 나눠지는 지 확인한다..아아..*/

     

    최근 백준문제를 풀며 세운 원칙인데 먼저 내가 생각해보다가 계속 같은 구간에서만 맴돌고 있음을 느끼면 (천장을 느끼면) google에서 insight를 얻기로 했다.

     

    그래서 찾아보니 문제의 핵심은 '최소 봉지 수' 이기 때문에 5kg인 봉지를 먼저 채워넣으면 '최소 봉지'가 될 수 있단 것이었다. 아하?!

     

    그래서 내가 세운 조건들을 5kg부터 시작해서 순서대로 나열을 했다.

    하지만 오류가 났다. 왜지?

     

    보아하니 '더하기'라는 것을 내가 간과했다.

    예를들어, 19kg면 이는 5kg 2봉지, 3kg 3봉지로 이뤄질 수 있지만 해당 값을 곱하기와 나누기를 이용하게되면 3과 5의 배수에 해당하지 않기에 값이 없다는 메세지가 뜨게 된다. 아아..

     

    그래서 좀 더 아이디어를 얻기위해 살펴보니 (-) 를 이용하고 있었다.

    즉, (-)를 통해서 해당 값이 3과 5의 조합으로 이루어져 있는가를 판단하는 것이다.

     


    // 최종제출
    
    let N = 7;
    let count = 0;
    
    while (true) {
        if ( N % 5 == 0 ) {
            count += parseInt( N / 5 )
            break;
        } else if ( N < 3) {
            count = -1;
            break;
        } else {
            N -= 3
            count ++
        }
    }
    
    console.log(count)

     

    따라서 요약하면 다음과 같다.

     

    1. 최소 설탕봉지를 구하는 문제이다.

    2. '최소'이기 때문에 가장 kg가 높은 봉지를 먼저 센다.

    3. 모두 5kg로 이뤄지지 않을 때에는 어쩔 수 없이 3kg를 이용해야 한다.

    (따라서 설탕kg에서 3kg를 차감하고 3kg 봉지를 사용했으니 1을 더한다)

    4. 3kg를 차감한 남은 값이 5kg로 이뤄지는지를 다시 확인한다.

    5. 설탕의 최소kg이 3kg이므로 남은 kg가 3kg보다 적으면 배달할 수 없다. 즉, -1이 된다.

     

     


     

    After solving this problem..

     

    요즘 문제를 풀며 느끼는건 내가 진짜 멍청해졌다는거다.

    이전에는 항상 머리를 사용하려고 암산을 하고 새로운 것들을 시도하고 도전하며 살았는데 회사라는 곳에 묶이고 나니 이제는 간단한 덧셈 뺄셈조차 암산이 안된다. 뇌가 정지해버린 느낌이다.

    네가 머리를 안 썼으면서 왜 회사탓을 하느냐?라고 묻는다면, 물론 내가 머릴 안 쓴 것도 있지만 굳이 이유를 찾자면 회사라는 곳이 내 생활의 '안정성'을 보장해 줘서랄까.

     

    예전에 왜 어른들이 빨리빨리 이해를 못하는지 이해가 안됐는데 지금 내가 그 상태다. 그래서 문제를 풀면서 계속해서 나의 천장을 마주하고 있다. 하지만 시간이 걸리더라도 꾸준히한다면 그 천장은 깨지기 마련이다.

    중요한건 '하.. 난 왜이러지'가 아니라 내가 모르는 것을 얼른 받아들이고 내것으로 만드는 거니까.

     

    열심히하되 효율적으로 하자.

    Time is Ticking.

Designed by Tistory.