본문 바로가기
알고리즘

[프로그래머스 LV2] 마법의 엘리베이터 JS

by limew 2023. 12. 7.

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

 

 

 


 

문제요점

  • 절대값이 10^c인 버튼
  • 누르면 현재 층 수 + 버튼 으로 이동
  • 0보다 작으면 움직이지 않음
  • 버튼 한번에 마법돌 1개
  • 0층으로 가는데 필요한 최소버튼

생각

  • 큰 수 => 규칙 => 자릿수마다

 

문제풀이

맨 밑의 자릿수부터 하나씩 제거해가며 층이 0이 될 때까지 순회하는데

각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단해야하는데 가능한 케이스는 두가지이다

  1. 해당 숫자만큼 버튼을 누르냐
  2. 10에서 해당 숫자를 뺀 만큼 누를 것이냐 (단 한 자릿수 위에 올림처리를 해야함)

예를 들어 43의 두가지 케이스는 이렇다

  1. 40 + 3
  2. 50 - 7

1의 자리부터 확인하면서

5미만이면 내린다 (자릿수 값 그대로)
5보다 크면 올린다 (기존 자릿수의 상위자리에+1을 하고 기존 자릿수는 10의 보수를 가진다.)

 

단 5일때는 조금 생각해봐야한다.

5가 나왔는데 기존의 상위자리가 5보다 크면 올림하고 그 외의 경우는 내리는게 맞다.

즉 정리하면 

  • 5미만은 digit 만큼 추가
  • 5초과는 10-digit 만큼 추가하고 윗자릿수 올림
  • 5일때는 윗자릿수에 따라 달라짐
    • 윗자릿수가 5이상이면 digit추가하고 윗자릿수 올림
    • 윗자릿수가 5미만이면 digit추가

일의 자릿수가 5미만, 5초과인경우

 

 

 

1의 자리가 5일때 상위자리수에 따른 최소값

 

 

function solution(storey) {
  var answer = 0;
  // 1자릿수부터 하나씩 제거해가며 층이 0이 될 때까지 순회
  while (storey > 0) {
    const digit = storey % 10; // 현재 자릿수
    storey = Math.floor(storey / 10); // 현재 자릿수 제거한 다음 층

    if (digit < 5) {
      answer += digit; // 현재자릿수가 5미만이면 -연산을 함 => digit추가
    } else if (digit > 5) {
      answer += 10 - digit; // 5초과이면 +연산을 함 => 10-digit 추가
      storey += 1; // 윗자릿수 올림
    } else {
      // 5일때는 윗 자릿수 확인
      answer += digit;
      if (storey % 10 >= 5) {
        // 윗자리수가 5이상이면 올림
        storey += 1;
      }
    }
  }
  return answer;
}

 

 

'알고리즘' 카테고리의 다른 글

줄 서는 방법  (0) 2023.12.08
롤케이크 자르기  (0) 2023.12.07
비트마스킹  (0) 2023.12.06
[프로그래머스] 숫자 변환하기  (0) 2023.12.06
[프로그래머스] 코딩테스트 공부  (0) 2023.11.25