[프로그래머스 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);
}