코딩테스트

[JS] 마법의 엘리베이터

미안하다 강림이 좀 늦었다 2024. 4. 30. 15:28

 

 

난이도: Lv. 2

정답률: 49%

문제: https://school.programmers.co.kr/learn/courses/30/lessons/148653

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

알고리즘

  1. 현재 층의 일의 자리 숫자가 5보다 크면 일의 자리 숫자가 0이 되도록 층을 올라간다. 현재 층의 십의 자리 바뀔 것이므로 현재 층에서 10으로 정수 나눗셈을 하고, 1을 더한다. 이번에 사용한 마법의 돌은 (10 - 현재 층의 일의 자리 숫자)이다.
  2. 현재 층의 일의 자리 숫자가 5보다 작으면 내려간다. 현재 층을 10으로 정수 나눗셈하고, 사용한 마법의 돌은 현재 층의 일의 자리 숫자와 동일하다.
  3. 현재 층의 일의 지리 숫자가 5면 십의 자리 숫자도 봐야 한다. 십의 자리 숫자가 5 이상이면 위층으로 올라가야 하고, 5 미만이면 아래층으로 내려가야 한다.
  4. 현재 층이 0이 될 때까지 1 ~ 3 분기문을 반복한다.

 

 

코드

function solution(storey) {
    let answer = 0, newStorey = storey, stoneNum;

    function storeyUp(units) {
        return [10 - units, newStorey + 1];
    }

    while (newStorey > 0) {
        const units = newStorey % 10;
        newStorey = Math.floor(newStorey / 10);
        stoneNum = units;

        if (units > 5) {
            [stoneNum, newStorey] = storeyUp(units);
        } else if (units === 5) {
            const tens = newStorey % 10;

            if (tens >= 5)
                [stoneNum, newStorey] = storeyUp(units);
        }

        answer += stoneNum;
    }

    return answer;
}