프로그래머스

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

programmers.co.kr

 


 

  • 문제

현재의 층수인 int 형이 주어지고 이를 +-10^n층을 옮겨 다니며 0층으로 이동하는 최수 횟수를 구하는 것이다. 10^n층을 옮기는데 1의 횟수가 추가된다.

 

  • 입력

현재 층수가 입력으로 주어진다. 

 

1 <= storey <= 100,000,000

 

  • 풀이

10^0의 값인 1층부터 0으로 맞추며 storey값이 0이 될 때까지 %10, /=10을 해주며 구하면 된다고 생각했다.

 

5층 이하인 경우 현재 1의 자리 층수만을 더 해준다. 

answer += rest;

6층 이상인 경우 (10-현재 1의 자리 층수)만을 더 해주며 storey에 1을 더해준다.

answer += (10-rest);
storey++;

 

 

  • 오답 코드
class Solution {
    public int solution(int storey) {
        int answer = 0;
        while(storey != 0) {
            int rest = storey%10;
            storey /= 10;
            if(rest <= 5) {
                answer += rest;
            } else {
                storey++;
                answer += (10-rest);
            }
        }
        return answer;
    }
}

하지만, 해당 코드는 정확도에서 문제가 발생했다.

 

문제는 1의 자리 수가 5일 때 발생한다. 만약, storey 값이 55라고 가정해보자. +5를 해도, -5를 해도 총 횟수는 10으로 문제가 발생하지 않는다. 하지만, storey 값이 195라고 가정해보자. +5를 하면 200이되고 총 7번만에 0층으로 간다. 하지만, -5를 하면 총 8번만에 0층으로 간다.

 

위의 문제를 해결하는 방법은 1의 자리 수가 5인 경우 10을 나눈 storey 값의 1의 자리 수가 5 이상인 경우 아래의 작업을 해야한다.

storey++;
answer += (10-rest);

 

  • 정답 풀이
class Solution {
    public int solution(int storey) {
        int answer = 0;
        while(storey != 0) {
            int rest = storey%10;
            storey /= 10;
            if(rest <= 5) {
                if(rest == 5 && storey%10 >= 5) {
                    storey++;
                    answer += (10-rest);
                } else {
                    answer += rest;
                }
            } else {
                storey++;
                answer += (10-rest);
            }
        }
        return answer;
    }
}

 

 

 

 

+ Recent posts