[JAVA] 마법의 엘리베이터 - 프로그래머스 LV2

나길진·2023년 12월 24일
0

프로그래머스

목록 보기
1/9

해당 문제 링크

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

문제풀이

제한사항

  • 1 ≤ storey ≤ 100,000,000

각 자리수의 값을 알아야 해서 최대 100,000,000을 10으로 계속 나눴을 때 9번만 돌면 되기 때문에 시간복잡도의 고민은 하지 않았다.

1차 풀이

  1. storey 10의 나머지를 구한다.
  2. 나머지가 1~4이면 해당 값만큼 answer에 더한다.
  3. 5~9이면 10 - (나머지)의 값을 answer에 더하고 storey에 10을 더한다.(다음 자리 층수로 넘어갔기 때문에)
  4. storey가 0이 될 때 까지 1~3을 반복한다.

1차 풀이 문제점

테스트 5,6,8,9에서 계속 실패했다. 테스트 코드를 여러경우 작성하는 와중에 45의 값이 실패하는 걸 찾았다.
실패하는 이유로는, 나머지가 5가 나왔을 때 무조건 다음 자리 층수로 넘어가는 코드로 작성했는데 45층 같은 경우 최단 횟수는 9번이 정답이지만 위에 풀이로는 최단 횟수가 11번으로 구해지는 코드였다.

2차 풀이

  1. storey 10의 나머지를 구한다.
  2. 나머지가 5인 경우
    2-1. answer에 5(나머지)를 더한다.
    2-2. 다음 자리 층수를 구해서 5~9이면 storey에 10을 더한다.(층수를 더했기 때문에)
  3. 나머지가 1~4이면 해당 값만큼 answer에 더한다.
  4. 6~9이면 10 - (나머지)의 값을 answer에 더하고 storey에 10을 더한다.
  5. storey가 0이 될 때 까지 1~3을 반복한다.

소스코드

public int solution(int storey) {
	int answer = 0;
        
    while( storey != 0 ){
    	// 1. storey 10의 나머지를 구한다.
        int modStorey = storey % 10;
        
        // 2. 나머지가 5인 경우            
        if( modStorey == 5 ){
        	// 2-1. answer에 5(나머지)를 더한다.
        	answer += modStorey;
            // 2-2. 다음 자리 층수를 구해서 5~9이면 storey에 10을 더한다.(층수를 더했기 때문에)
            int nextStorey = storey / 10 % 10;
            if( nextStorey >= 5 ){
                storey += 10;
            }
        }else if( modStorey < 5 ){
        	// 3. 나머지가 1~4이면 해당 값만큼 answer에 더한다.
            answer += modStorey;
        }else{
        	// 4. 6~9이면 10 - (나머지)의 값을 answer에 더하고 storey에 10을 더한다.
            answer += 10 - modStorey;
            storey += 10;
        }
        storey /= 10;
    }

    return answer;
}

결과

profile
백엔드 개발자

0개의 댓글

관련 채용 정보