본문 바로가기

프로그래머스(Java)/Level 2

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

728x90

코드 힌트

  1. 문제의 핵심: 최소한의 조작으로 층수를 0으로 만들기
    • 이 문제는 각 자리 숫자를 더하거나 빼서 전체 storey 값을 0으로 만드는 과정에서, 최소한의 조작 횟수를 구하는 문제입니다. 한 자리씩 차례대로 내려가면서, 그 자리 숫자가 5보다 크거나 작을 경우에 따라 올리거나 내립니다.
  2. 각 자리 숫자 처리 방식
    • 올림(UP): 만약 현재 자리 숫자가 5보다 크다면, 그 숫자를 올리는 것이 더 유리합니다. 예를 들어, 8인 경우 2를 더해서 올림 처리합니다. 이때 상위 자리 숫자가 하나 증가합니다.
    • 내림(DOWN): 현재 자리 숫자가 5보다 작으면 내리는 것이 더 유리합니다. 예를 들어, 3인 경우 3만큼 내려서 0으로 만듭니다.
  3. 5일 경우
    • 현재 자리 숫자가 정확히 5일 때는 다음 자리 숫자를 확인합니다. 만약 다음 자리 숫자가 5 이상이면 올리는 것이 유리하고, 그렇지 않으면 그대로 내립니다. 이는 다음 자리 수가 결과에 미치는 영향을 고려한 전략입니다.
  4. 전체 과정
    • 문제의 과정은 오른쪽(1의 자리)부터 한 자리씩 처리해가며, 최소한의 횟수로 각 자리 수를 조작하여 0으로 만들려고 합니다. storey의 각 자리에 대해 숫자를 결정하며, 올림이나 내림에 따라 결과가 바뀌므로 이 부분을 잘 처리해야 합니다.

 

예시 설명

예시 1: storey = 564

  1. 1의 자리: 4
    • 4는 5보다 작기 때문에 내립니다. 4를 더해서 처리하고, storey = 56.
  2. 10의 자리: 6
    • 6은 5보다 크므로 올립니다. 4를 더해서 올림 처리하고, 상위 자리인 storey = 57.
  3. 100의 자리: 5
    • 현재 5일 때, 상위 자리인 10의 자리가 7이므로 올립니다. 5를 더해서 처리하고, storey = 0.

예시 2: storey = 499

  1. 1의 자리: 9
    • 9는 5보다 크므로 1을 더해서 올림 처리합니다. 상위 자리로 넘기며, storey = 50.
  2. 10의 자리: 9
    • 다시 9는 5보다 크기 때문에 1을 더해서 올림 처리합니다. 상위 자리로 넘기며, storey = 5.
  3. 100의 자리: 5
    • 상위 자리가 0이므로 더하지 않고 그대로 처리합니다. storey = 0.

정답은 더보기 클릭

더보기
class Solution {
    public int solution(int storey) {
        int result = 0;
        
        // 목표층이 0이 될 때까지 반복
        while (storey > 0) {
			int floor = storey % 10; 
            // 현재 층의 1의 자리 숫자를 추출
			storey /= 10;
            // 층을 10으로 나눠서 자리 이동

			if (floor > 5) {
				// 1의 자리가 5보다 클 경우 올림
				result += 10 - floor;  // 10 - 현재 자리 수만큼 올려서 더함
				storey++;  // 올림을 반영해 상위 자리 수를 하나 증가
			} else if (floor < 5){
				// 1의 자리가 5보다 작으면 내림
				result += floor;  // 현재 자리 수만큼 더함
			} 
            // 1의 자리가 정확히 5일 때 처리
            else { 
				result += floor;  // 5를 더함
				if (storey % 10 >= 5) {
                    // 만약 다음 자리 수가 5 이상이면 올림 처리
                    storey ++;
                }
			} 
		}
        
        return result;  // 최종 최소 조작 수 반환
    }
}
728x90