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

 

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

 

프로그래머스

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

programmers.co.kr


 

해결전략

 

구현

 


 

정답 코드

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int solution(int storey) {
    
    vector<int> level; // 배열에 storey의 끝자리 수부터 순서대로 담는다 
    while(storey){
        level.push_back(storey % 10);
        storey /= 10;
    }

    int cnt = 0;
    for (int i = 0; i < level.size(); i++) // 끝자리 수부터 차례대로 검사
    {
        if (level[i] == 10){
            if (i == level.size() - 1) cnt += 1;
            else
                level[i + 1] += 1; // 앞자리 수에 +1
        }
        else if (5 < level[i] && level[i] < 10) {
            cnt += 10 - level[i];

            if (i == level.size() - 1) cnt += 1;
            else
                level[i + 1] += 1;  // 앞자리 수에 +1
        }
        else if (5 == level[i]){
            if (i < level.size() - 1 && 5 <= level[i + 1]) {
                cnt += 10 - level[i];

                if (i == level.size() - 1) cnt += 1;
                else
                    level[i + 1] += 1;  // 앞자리 수에 +1
            }
            else
                cnt += level[i];
        }
        else {
            cnt += level[i];
        }
    }
    
    return cnt;
}

int main()
{
    cout << solution(16) << "\n";   // 6
    cout << solution(2554) << "\n"; // 16
    cout << solution(5999) << "\n"; // 6
    cout << solution(5556) << "\n"; // 
    cout << solution(6000) << "\n"; // 5
    cout << solution(678) << "\n"; // 8
    cout << solution(999) << "\n"; // 8
    cout << solution(646) << "\n"; // 13
    cout << solution(545) << "\n"; // 14

    return 0;
}

 

 


 

 

어느 고수의 간결한 Version

 

#include<algorithm>
using namespace std;

// 주어진 숫자 각 자릿수를 최소화하는 데 필요한 비용을 계산하는 재귀 함수
int Calculate(int x)
{
    if(x < 10)  // 만약 문제에서 주어진 입력값이 10보다 작다면, 숫자를 그대로 두거나 0으로 변경하는 데 필요한 비용 중 작은 값을 반환
    	return min(x, 10-x+1);
    
    // 현재 숫자의 일의 자릿수(a)와 일의 자릿수를 0으로 만드는 데 필요한 비용(b)를 계산
    int a = x % 10; 
    int b = 10 - x % 10;
    
    // 현재 숫자의 일의 자릿수를 그대로 두거나 0으로 변경하는 두 가지 경우를 고려하며, 이 중 더 작은 비용을 반환
    return min(Calculate((x-a)/10)+a, Calculate((x+b)/10)+b);
}

int solution(int storey) {
    return Calculate(storey);
}