[프로그래머스] LV 2 마법의 엘리베이터

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

접근법

  1.  입력이 최대 1억이므로 O(n) 미만의 알고리즘을 선택해야한다 (dp도 될듯?)
  2. storey의 각 자리수를 보며 계산했다. 층 수는 1 ~ 4, 5, 6 ~ 9 로 패턴을 파악할 수 있다.
    1. 1 ~ 4는 그냥 0층으로 가면된다
    2. 5는 윗 자리수를 고려해야한다
    3. 6 ~ 9는 10층으로 올라가서 0으로 간다
  3.  위 패턴에서 1,3은 직관적으로 납득할 수 있지만 5는 좀 다르다.
    1. 예를 들어 555의 경우
    2. 550, 560 으로 가는경우 모두 5개의 마법의 돌이 필요하다
    3. 500, 600 으로 가는경우 각각 5, 4개의 마법의 돌이 필요하다
    4. 0으로 가는 경우 모두 5개의 마법의 돌이 필요하다
  4. 이처럼 현재 자리수가 5인경우엔 바로 윗자리수가 5이상이라면 올라가는 방법이 최소이다.
  5. 마지막 자리수의 5는 내려가는게 최소이다.

 

코드

class Solution {
    public int solution(int storey) {
        int ans = 0;
        while(storey > 0){
            int cur = storey % 10;
            storey /= 10;
            
            if(cur == 5 && storey % 10 >= 5 ){
            	//위 자리수가 5이상이면 올라간다
                storey ++;
                ans += 10 - cur;
            }else if (cur >= 6){
            	//올라 간다
                storey ++;
                ans += 10 - cur;
            }else{
            	//바로 내려 간다
                ans += cur;
            }
            
        }
        return ans;
    }
}