본문 바로가기
기초다지기/JS 코딩테스트

javaScript 이동시 사용해야하는 최소 건전지 양 구하기

by 김빵그 2023. 11. 28.

문제 

한 번에 k칸 앞으로 갈 수도 , 현재까지 온거리 *2 위치로 순간이동을 할 수도 있다
k칸 점프시에는 k만큼 건전시 사용량이 드는 반면 순간이동은 건전지를 소모하지 않을 때 
n만큼 떨어진 장소로 이동할 때 최소 건전지 소모량을 리턴

나의 풀이 

function solution(n)
{
    let answer = 0;

    while (n > 0) {
        if (n % 2 === 0) {
            // 현재 거리가 짝수일 경우
            n /= 2;
        } else {
            // 현재 거리가 홀수일 경우
            n -= 1;
            answer++;
        }
    }

    return answer;
}
  • while
    • 앞으로 k칸을 점프하면 k만큼 건전시 사용량이 든다는 조건으로 거리가 0이 될 때까지 계속 루프 (점프 또는 순간이동 선택) 
    • 짝수 홀수 판별 짝수시엔 순간이동을 선택하고 , 홀수 일 때는 -1을 빼서 짝수로 만든후 순간이동 선택한다 

다른 풀이

function solution(n) {
    if (n === 1) return 1;

    const nArr = Array.from(n.toString(2));
    return nArr.reduce((a, b) => (+a) + (+b));
}
  • 숫자 n을 이진수로 변환 후, 각 자릿수별로 분리하여 배열로 만듦
  • a와 b를 숫자로 변환하고 두 숫자를 더한 결과를 반환
  • 어떠한 수 n을 2로 나누고 그 몫을 또 2로 계속 해서 나누면 나오는 나머지들의 합은 어떠한 수를 이진수로 변환한 수의 1의 개수와 같다는 것에서 .. 활용
function solution(n)
{
    return n.toString(2).replace(/0/g,"").length
}
  • 이진수 변환후 0을 모두 제거하고 남은 문자열의 길이를 반환
function solution(n)
{
    if(n == 1) return 1;

    var battery = 0;
    // n을 2로 나눠가며 나오는 나머지의 합
    while(n>0) {
        battery += n%2;
        n = Math.floor(n/2);
    }

    return battery;
}