프로그래밍/코딩테스트

코딩테스트 : 마법의 엘리베이터

백사니 2025. 3. 1. 22:00
728x90
반응형

해당 문제는 storey(층 번호)를 0층으로 만들기 위해 엘리베이터 버튼을 최소 몇 번 눌러야 하는지를 구하는 문제다.

엘리베이터 버튼을 누를 때 한 자리씩 조정할 수 있으며, 5 이상의 숫자는 올림, 4 이하의 숫자는 내림하는 방식으로 최소 횟수를 구한다. 또한 낮은 자리의 반올림이 높은 자리에 영향을 줄 수 있으므로 낮은 자리부터 높은 자리로 계산한다.

예를 들어,

  • storey = 16 → 6을 올림(4) →20 → 2을 내림(2) → 0 (총 6번)
  • storey = 2554 → 4 내림(4) → 2550→ 5 올림(5) →2600 → 6 올림(4) → 3000 → 3을 내림(3) → 0(총 16번)
#include <iostream>
#include <cmath>

using namespace std;

int solution(int storey) {
    int answer = 0;  // 버튼 클릭 횟수를 저장할 변수

    while (storey > 0) {  // storey가 0보다 작을 때까지 반복
        int lastDigit = storey % 10;  // storey의 마지막 자리수를 구함
        int nextDigit = (storey / 10) % 10;  // storey의 마지막 자리 이전 자리수를 구함

        // 마지막 자리가 6 이상이면 올림, 5 이하이면 내림
        if (lastDigit > 5 || (lastDigit == 5 && nextDigit >= 5)) {
            // 올림 처리: 10 - lastDigit를 더하여 올림을 수행
            storey += 10 - lastDigit; 
        } else {
            // 내림 처리: lastDigit를 빼서 내림을 수행
            storey -= lastDigit; 
        }

        storey /= 10;  // 마지막 자리를 제거하고 다음 자리로 이동
        // 클릭 횟수를 추가: 버튼 클릭 횟수는 해당 자리수에서 가장 작은 버튼 횟수
        answer += min(lastDigit, 10 - lastDigit);  
    }

    return answer;  // 계산된 최소 버튼 클릭 횟수를 반환
}

 

728x90
반응형