[JS] 개미군단 (몫,나머지)

김zunyange·2023년 12월 17일
0
post-thumbnail

문제 설명

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

제한 사항

  • hp는 자연수입니다.
  • 0 ≤ hp ≤ 1000

입출력 예

hpresult
235
246
999201

입출력 예 설명

입출력 예 1)
hp가 23이므로, 장군개미 네마리와 병정개미 한마리로 사냥할 수 있습니다. 따라서 5를 return합니다.

입출력 예 2)
hp가 24이므로, 장군개미 네마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 6을 return합니다.

입출력 예 3)
hp가 999이므로, 장군개미 199 마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 201을 return합니다.

내 풀이법

우선 처음은 무조건 hp 를 5로 나눠야 한다. //hp5
그리고 남은 나머지를 3으로 나누고 //hp3
hp3가 정수일 경우에는 더이상 계산할 게 없으므로 끝내고
hp3가 실수일 경우에는 일개미 한마리만 더해주면 되므로 if 문으로 나눴다.
풀이법 과정을 적다보니 나머지 연산자(%) 를 써줘도 됨을 알았다.
아무튼간에 나의 첫 풀이법은 아래와 같다.
콘솔로 값을 찍어가며 식을 작성했다.

function solution(hp) {
    var answer = 0;
    
    const hp5 = Math.floor(hp/5);
    const hp3 = (hp - 5*hp5)/3;
    
    if (Number.isInteger(hp3) === false) {
        answer = hp5 + Math.floor(hp3) + 1;
    }
    
    return answer;
}

입출력 예시인 2번과 3번은 통과했는데 1번의 결괏값이 0 이 나왔다.
콘솔로 hp5와 hp3 를 찍어봤는데 4와 1이 잘 나왔다. 그런데 왜 0일까 싶었는데 hp가 23인 경우 hp3 가 정수로 끝나서 if문이 돌아가지 않게 된다.
따라서 처음에 선언했던 var answer = 0 이 나온것!

그래서 else 문까지 작성해주었다.

function solution(hp) {
    var answer = 0;
    
    const hp5 = Math.floor(hp/5);
    const hp3 = (hp - 5*hp5)/3;
    
    if (Number.isInteger(hp3) === false) {
        answer = hp5 + Math.floor(hp3) + 1;
    } else {
        answer = hp5 + Math.floor(hp3);
    }
    
    return answer;
}

좋다. 테스트 1,2,3번 모두 통과가 됐는데 !!

채점을 하려니 테스트 4가 통과되지 않았다. 흠 이번엔 어떤 경우가 통과되지 않았을까


앗 hp가 5 미만일 경우인 것 같다.
hp가 4라면
hp5 값은 0이고 , hp3 값은 1.xx이고
answer 은 hp5 + Math.floor(hp3) + 1로 , 즉 2가 나올 것이다.
.. 맞는데 2 🥲

직접 테스트를 추가해보겠다.

아하 !! 테스트를 추가하면서 깨달았다.
4와 3까지는 옳은 방법이지만, 2가 될 경우 0+0+1로 1이 나오게 될 것이다.

2 뿐만 아니라 1의 자리 수가 '2'인 경우가 모두 같은 이유로 1이 부족하게 된다.

answer = hp5 + Math.floor(hp3) + 1

+1로 해줬기 때문인데 Number.isInteger(hp3) === false 경우 말고도 Number.isInteger(hp3) === 0.xx 일 경우도 조건문을 추가해줘야할 것 같다.

function solution(hp) {
    var answer = 0;
    
    const hp5 = Math.floor(hp/5);
    const hp3 = (hp - 5*hp5)/3;
    
    if (Number.isInteger(hp3) === false) {
        answer = hp5 + Math.floor(hp3) + 1;
    } else if (Math.floor(hp3) === 0) {
        answer = hp5 + Math.floor(hp3) + 2;
    } else {
        answer = hp5 + Math.floor(hp3);
    }
    
    return answer;
}

else if문을 추가해줬지만 .. hp 가 2일때 결과값이 1이 나오고 있다.
콘솔을 찍어봐야겠다.
아하 ..! 0.xx 도 실수값이니까 첫번째 if문에서 걸리게 되서 else if 문까지 못하는 것이다.
그렇다면 순서를 바꾼다면 ?!

function solution(hp) {
    var answer = 0;
    
    const hp5 = Math.floor(hp/5);
    const hp3 = (hp - 5*hp5)/3;
    
    if (Math.floor(hp3) === 0) {
        answer = hp5 + Math.floor(hp3) + 2;
    } else if (Number.isInteger(hp3) === false) {
        answer = hp5 + Math.floor(hp3) + 1;
    } else {
        answer = hp5 + Math.floor(hp3);
    }
    return answer;
}

... 예시 테스트는 다 통과했는데 채점을 하니 이번에는 더 많은 실패가 떴다😂

아무래도 % 연산자를 사용해야겠다. 너무 헷갈린다 ..

장군개미 = hp/5 의 정수부분 = Math.floor(hp/5)
병정개미 = hp%5 를 3으로 나눈 몫 = Math.floor((hp%5)/3)
일개미 = hp%5를 3으로 나눈 나머지 !!!!!!! = (hp%5)%3

일개미를 나머지로 생각했어야 했다.

최종 풀이법

function solution(hp) {
    var answer = 0;
    
    const hp5 = Math.floor(hp/5);
    const hp3 = Math.floor((hp%5)/3);
    const hp1 = ( hp % 5 ) % 3;
    
    answer = hp5 + hp3 + hp1;
    
    return answer;
}

단순하게 생각하면 쉬운건데 머릿 속으로 계산하면서 적으려다보니 잠깐 꼬여서 풀렸나보다. 하핳.
레벨 제로여도 직접 적어가며 풀이하는 버릇을 들일 것!

다른 유저들의 풀이법을 보니,
~~ 연산자를 Math.floor() 대신 사용해도 된다고 한다.

  • ~~(hp/5) = Math.floor(hp/5)
profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글