Game Develop

[Algorithm] Programmers :: 마법의 엘리베이터 본문

Algorithm/Programmers

[Algorithm] Programmers :: 마법의 엘리베이터

MaxLevel 2023. 6. 11. 05:15

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

 

프로그래머스

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

programmers.co.kr

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int solution(int storey) 
{
    int answer = 0;
 
    while (storey != 0)
    {
        int b = storey % 10;
        storey = storey / 10;
 
        if (b > 5 || (b == 5 && storey % 10 >= 5)) // 자릿수를 올려야하는 모든 경우.
        {
            answer += 10 - b;
            ++storey;
        }
        else answer += b;
    }
 
    return answer;
}
cs

0을 만들기위한 최소의 동작을 구해야 하는 문제이다.

일의자리숫자부터 접근할건데, 기본적으로 현재자리숫자가 0이되기위한 최소의 동작을 취한다.

 

예를들어 첫값이 16이라면, 6이 0이되기위해선 -1을 6번해서 0이되거나 +1을 4번해서 0이되고 올림수를 1증가시키는 것이다.

최소의 동작을 해야하니 5미만이라면 -하는게 더 빠르고 5를 초과한다면 +를 하는게 더 빠를것이다.

 

단, 문제는 값이 5일때이다. 이 값은 -를 하든 +를 하든 같은 횟수로 0이 될 수 있다.

이럴때는 그 다음자리숫자값에 따라 취해야할 행동이 달라진다.

비슷한 원리로 그 다음자리 숫자값이 5미만이라면 -를 하고 5 이상이라면 +를 한다.

 

왜 다음자리숫자값은 5'이상'으로써 5를 포함할까?
어차피 내리든,올리든 횟수가 5번으로 똑같다면 그 다음을 위해서 올려버리는게 낫기 때문이다.

안올려버리고 그대로 둬버리면 결국 해당숫자를 올리거나 내리기위해 또 5번을 해야하는데, 그냥 올려버리면 해당숫자때 6이 되니까 4번만 올리면 되기 때문이다.