안녕하세요

프로그래머스 JS 마법의 엘리베이터 (덧셈 올림) 본문

프로그래머스/Lv.2

프로그래머스 JS 마법의 엘리베이터 (덧셈 올림)

sakuraop 2023. 12. 11. 17:49

마법의 엘리베이터(*) 문제 보기

-1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼
엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않습니다.
0층으로 가기 위해 최소한으로 버튼 누르는 횟수는?


문제 풀이

n의 자릿수를 가장 빠르게 0으로 만드는 방법은?

올려주는 경우에는 다음 자릿수가 +1이 된다.

 

n=1일 경우

1~5의 경우에는 내려주는게 빠르다.

6보다 큰 경우에는 올려주는게 빠르다.

 

그런데 올라가는 것이 다음 자릿수들에 영향을 줄 때를 생각해야 한다.

99인 경우

1의 자리를 1 올려주었지만 10의 자리와 100의 자리가 함께 영향을 받았다.

올려줄 경우에는 자릿수 변경에 신경을 써주면 된다.

 

555인 경우 내려주는 것 보다 올려주는 것이 빠르다.

내려줄 경우 5+5+5 = 15회

올려줄 경우에는 560(5회) + 600(4회) + 1000(4회) + 0000(1회) = 14회


문제 코드

function solution(storey) {
  const splittedStorey = storey.toString().split("").map(Number);
  let count = 0;

  for (let i = splittedStorey.length - 1; i >= 0; i--) {
    // 올라가는게 빠른 경우 : 현재 층계가 5 또는 현재 층계가 5이고 다음 층계가 5이상일 때
    if (splittedStorey[i] > 5 || (splittedStorey[i] === 5 && splittedStorey[i - 1] >= 5)) {
      count += 10 - splittedStorey[i];
      splittedStorey[i] = 10;

      // 현재 층계를 0으로 만들고 다음 층계에 +1
      while (splittedStorey.includes(10)) {
        const storeyIndex = splittedStorey.lastIndexOf(10);
        splittedStorey[storeyIndex] = 0;
        splittedStorey[storeyIndex - 1] ? splittedStorey[storeyIndex - 1]++ : splittedStorey.unshift(1);
        i++;
      }
      continue;
    }

    // 내려가는게 빠른 경우 : 나머지는 내려가는게 빠름
    if (splittedStorey[i]) {
      count += splittedStorey[i];
      splittedStorey[i] = 0;
    }
  }

  return count;
}

solution(999);

1의 자릿수부터 올라가며 확인한다.

 

5보다 클 경우, 또는 5이면서 다음 층계가 5이상일 경우에는 올라가는 것이 더 빠르다.

현재 자릿수에서 변화된 층계를 반영한 뒤 반복 시행한다.

 

그렇지 않은 경우에는 내려가는 것이 더 빠르다.