본문 바로가기
C#/알고리즘 문제 풀기

프로그래머스 - 마법의 엘리베이터

by Toa_ 2025. 7. 31.

 

이번 문제는 int 형 숫자를 쪼갤 때 얼마나 효율적으로 나눌 수 있는지의 방법에 대한 문제였다

이때 10의 단위로 올라가는 과정에서의 여러 체크해야하는 분기가 존재한다.

 

ex ) 555, 545 같이 가장 낮은 자리 숫자가 5일때 다음 자리 숫자가 4 이하인지 5 이상이지에 따른 분기와

73,76 같이 가장 낮은 자리 숫자가 4이하나 6 이상일 경우의 분기를 적절하게 쪼개는 방식

 

 

위의 조건을 유념하여 가장 낮은 자리숫자부터 체크하는 while문을 사용하여,

전체 숫자를 확인하는 방식으로 구현하면 아래와 같이 나오게 된다.

 


 

 

ref의 참조형을 통해 원본도 가져오는 방식을 사용하였기에, Stone 메서드 안에서 마지막 자리 체킹을 할 수도 있지만

아직까지는 직관적인 형태를 가지고 있어야 코드의 구조를 구분하는데 용이하기 때문에 가장 높은 자릿수의 숫자의 체킹시에는 LastStone 메서드로 체크하도록 분리하여 풀었다.

 

 

public int solution(int storey)
{
    int answer = 0;
    while (storey / 10 > 0)
    {
        Stone(ref storey ,storey % 10, ref answer);
        storey /= 10;
    }
    LastStone(storey, ref answer);
    return answer;
}

void Stone(ref int ori,int num, ref int ans)
{
    if(num == 0) return;
    if(num <= 4)
    {
        ans += num;
        return;
    }
    if(num == 5)
    {
        if (ori / 10 != 0)
        {
            if((ori /10) % 10 >= 5)
            {
                ans += 5;
                ori += 10;
            }
            else
            {
                ans += 5;
            }
        }
        else
        {
            ans += 5;
        }
        return;
    }
    if(num >= 6)
    {
        ans += 10 - num;
        ori += 10;
        return;
    }
}

void LastStone(int num, ref int ans)
{
    if (num == 0) return;
    if (num <= 5)
    {
        ans += num;
        return;
    }  
    if (num >= 6)
    {
        ans += 11 - num;
        return;
    }
}