C++:: 프로그래머스 <마법의 엘레베이터>

jahlee·2023년 3월 16일
0

프로그래머스_Lv.2

목록 보기
11/106
post-thumbnail

간단하게 해당 자리수에서 최소로 0을 만들어주면 되는 문제이다. 이때 주의해야할 점은 다음 자리수가 5보다 크고 현자리수가 5일때는 올려주는것이 더 적게 이동한다는 점이다.
이에 대한 예시는 다음과 같다.

65 // 현자리 5 높은자리 >= 5 일때
70 (5)
100 (8)
0 (9) => 9번
간단하게 5일때는 올리던 내리던 5번을 움직이지만 올리는 경우 다음 자리수가 +1 되기때문에 이를 고려해준다 생각하면 된다.

#include <string>
#include <vector>

using namespace std;

void    recur(int cur, int *answer)
{
    if (cur == 0) return ;
    if (cur % 10 > 5 || (cur % 10 == 5 && (cur % 100) / 10 >= 5))
    {
        *answer += 10 - cur % 10;//올린만큼 ++
        cur += 10;//다음 자릿수 +1
    }
    else *answer += cur % 10;//내린만큼 ++
    if (cur / 10 > 0) recur(cur/10, answer);

}

int solution(int storey)
{
    int answer = 0;
    recur(storey, &answer);
    return answer;
}

더 간결한 풀이도 추가한다.

#include<algorithm>

using namespace std;

int sol(int num)
{
    if(num < 10) return min(num, 10-num+1);
    int a = num % 10, b = 10 - num % 10;//a == 내렸을때 , b == 올렸을때
    return min(sol((num-a)/10)+a, sol((num+b)/10)+b);
}

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

0개의 댓글