https://school.programmers.co.kr/learn/courses/30/lessons/148653
문제요점
- 절대값이 10^c인 버튼
- 누르면 현재 층 수 + 버튼 으로 이동
- 0보다 작으면 움직이지 않음
- 버튼 한번에 마법돌 1개
- 0층으로 가는데 필요한 최소버튼
생각
- 큰 수 => 규칙 => 자릿수마다
문제풀이
맨 밑의 자릿수부터 하나씩 제거해가며 층이 0이 될 때까지 순회하는데
각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단해야하는데 가능한 케이스는 두가지이다
- 해당 숫자만큼 버튼을 누르냐
- 10에서 해당 숫자를 뺀 만큼 누를 것이냐 (단 한 자릿수 위에 올림처리를 해야함)
예를 들어 43의 두가지 케이스는 이렇다
- 40 + 3
- 50 - 7
1의 자리부터 확인하면서
5미만이면 내린다 (자릿수 값 그대로)
5보다 크면 올린다 (기존 자릿수의 상위자리에+1을 하고 기존 자릿수는 10의 보수를 가진다.)
단 5일때는 조금 생각해봐야한다.
5가 나왔는데 기존의 상위자리가 5보다 크면 올림하고 그 외의 경우는 내리는게 맞다.
즉 정리하면
- 5미만은 digit 만큼 추가
- 5초과는 10-digit 만큼 추가하고 윗자릿수 올림
- 5일때는 윗자릿수에 따라 달라짐
- 윗자릿수가 5이상이면 digit추가하고 윗자릿수 올림
- 윗자릿수가 5미만이면 digit추가
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 |