문제 풀기/C#

117. 마법의 엘리베이터

kagan-draca 2025. 6. 4. 17:31

 

기본 틀 :

 

using System;

public class Solution {
    public int solution(int storey) {
        int answer = 0;
        return answer;
    }
}

 

문제를 보고 while문을 사용해 storey가 0이 아닐 경우 반복 작업 하도록 만들어줬다.

 

        while(storey != 0)
        {

        }

 

그리고 반복문 안에 storey % 10으로 현재 남은 층수를 구해줬다.

            int num = storey % 10;
            storey /= 10;

 

해당 남은 층수가 5초과이면 5층 위로 올라가고, 5미만이면 5층 내려가는 식으로 코드를 작성해줬다.

 

            // 5초과이면
            if(num > 5)
            {
                // (10 - num)만큼 1 버튼 누르기
                answer += (10 - num);
                // 다음 층수 +10 해줘야 됨
                storey += 10;
            }
            // 5미만이면 남은 num만큼 1 버튼 누리기
            else if(num < 5) answer += num;

 

다음으로 5일 경우를 생각해봐야 하는데

 

5인 경우 앞 자리 숫자가 어떻게 되느냐에 따라 위로 올라가는 것이 이득이 될 수 있게 된다.

 

ex) 55

 

5 올라감

=> 횟수 : 5

그에 따른 앞 자리 1증가 5 -> 6

6 올라감

=> 횟수 : 9
5 내려감 

=> 횟수 : 5

5 내려감

=> 횟수 : 10

 

앞 자리가 5이상일 경우 올라가게 되면 위와 같이 다음 횟수를 줄일 수 있는 것을 볼 수 있다.

 

그래서, 코드를 수정해보면

 

        int answer = 0;
        
        while(storey != 0)
        {
            // 현재 남은 층수
            int num = storey % 10;
            // 다음 남은 층수
            int next = (storey / 10) % 10;
            
            // 5초과이면
            if(num > 5)
            {
                // (10 - num)만큼 1 버튼 누르기
                answer += (10 - num);
                // 다음 층수 +10 해줘야 됨
                storey += 10;
            }
            // 5미만이면 남은 num만큼 1 버튼 누리기
            else if(num < 5) answer += num;
            // 5일 경우
            else
            {
                // 다음 횟수가 5이상 이면
                // 위로 올라가는 것이 이득
                if(next >= 5)
                {
                    // 5번 이동 및 10증가 반영
                    answer += num;
                    storey += 10;
                }
                // 아닐 경우 내려가는 것이 이득
                else answer += num;
            }
            storey /= 10;
        }

 

위와 같이 수정할 수 있다.

 

전체 코드 :

 

using System;

public class Solution {
    public int solution(int storey) {
        int answer = 0;
        
        while(storey != 0)
        {
            // 현재 남은 층수
            int num = storey % 10;
            // 다음 남은 층수
            int next = (storey / 10) % 10;
            
            // 5초과이면
            if(num > 5)
            {
                // (10 - num)만큼 1 버튼 누르기
                answer += (10 - num);
                // 다음 층수 +10 해줘야 됨
                storey += 10;
            }
            // 5미만이면 남은 num만큼 1 버튼 누리기
            else if(num < 5) answer += num;
            // 5일 경우
            else
            {
                // 다음 횟수가 5이상 이면
                // 위로 올라가는 것이 이득
                if(next >= 5)
                {
                    // 5번 이동 및 10증가 반영
                    answer += num;
                    storey += 10;
                }
                // 아닐 경우 내려가는 것이 이득
                else answer += num;
            }
            storey /= 10;
        }
        
        return answer;
    }
}

'문제 풀기 > C#' 카테고리의 다른 글

116. 점 찍기  (0) 2025.06.04
115. 호텔 대실(Tuple ,TimeSpan)  (5) 2025.06.02
114. (중요)배달 (튜플(Tuple), Custom Class)  (0) 2025.05.30
113. 전력망을 둘로 나누기  (0) 2025.05.26
112. 행렬 테두리 회전하기  (0) 2025.05.12