본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 프로그래머스

[프로그래머스] 마법의 엘리베이터 / 자바(Java)

728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 


해설

각 자리수에 있는 숫자들을 비교하되 각 숫자가 어떤지에 따라 올림이 발생하므로 가장 낮은 자리의 숫자부터 연산합니다.

int under = storey - (storey/10)*10;
storey/=10;

int형 숫자에 10을 나누고 곱하면 int의 특성상 1자리수가 사라진 수로 다시 나오므로 해당 연산을 통해 under는 항상 1의 자리 숫자가 나옴을 알 수 있습니다. 이후 본래 있던 값 storey를 10으로 나누어 가장 낮던 자리수를 지워줍니다.

이후 숫자에 대해 생각해보면 1씩 더하거나 뺴면서 가장 적은 연산수로 10 또는 0으로 만드려면

  1. 4이하인 경우 : 모두 뺴 0으로 만든다.
  2. 6이상인 경우 : 모두 더해 10으로 만든다.
  3. 5인 경우 : 10의 자리수에 따라 바뀐다
    1. 4이하인 경우 : 올림이 생기면 10의 자리수에서 손해가 생겨 모두 빼 0으로 만드는 것이 이득이다
    2. 5이상인 경우 : 올림이 생긴다면 10으로 만들기 편하도록 모두 더해 10으로 만든다
    3. 5인 경우  : 올림이 있다면 6이 되어 4번의 연산으로 가능하지만 올림이 없다면 5번의 연산으로 손해가되어 올려준다.
if(under <= 4) answer+=under;
else if(under >=6 ) {
    answer += 10-under; storey++;
}
else if(under==5){
    answer+=5;
    if(storey - (storey/10)*10>=5) storey++;
}

 

주의점

  •  

코드

class Solution {
    public int solution(int storey) {
        int answer = 0;
        while(storey!=0){
            int under = storey - (storey/10)*10;

            storey/=10;
            if(under <= 4) answer+=under;
            else if(under >=6 ) {
                answer += 10-under;
                storey++;
            }
            else if(under==5){
                answer+=5;
                if(storey - (storey/10)*10>=5) storey++; 
            }

        }
        return answer;
    }
}
728x90