내머리로는 해결하지 못했다..😭
여기 블로그의 코드를 보며 이해했는데,
설명하면 다음과 같습니다.
이 문제는 각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단🧐 해야합니다.
즉, Greedy
알고리즘 입니다.
각 자리수를 판단하기 위해서는 %연산을 사용하면 좋겠죠?
// 1의 자리 숫자
int oneDigit = number % 10;
올리면 무조건 이득보는 숫자는
6,7,8,9
이며,
내리면 무조건 이득보는 숫자는0,1,2,3,4
입니다.
왜냐구요? 🤷🏻♂️
만약 44층이라고 하면?
만약 47층이라고 하면?
만약 45층 이라고 하면?
만약 55층이라고 하면?
숫자 5인 경우에 다양한 경우가 발생합니다.🤯
일의 자리를 올리거나 내리기 전에 생각해봅시다.🤔 십의 자리를 한 번 봐볼까?
일의 자리를 올리면 십의 자리가 상승합니다.
555 -> 560 -> ?
일의 자리를 내리면 십의 자리가 그대로 입니다.
555 -> 550 -> ?
어떤게 더 이득일까요?
당연히 일의 자리를 올려서 십의 자리가 상승하는게 이득입니다.!
그렇습니다.!!!!
일의 자리가 5인 경우에는 십의 자리가 5이상인지 이하인지 파악해야합니다.
따라서 555층을 다음과 같이 해결할 수 있습니다.
일의 자리 숫자가 5이고, 그 앞에 십의 자리숫자가 5 이상이기 때문에 올리는게 이득 입니다. 👍
555 -> 560(5) -> 600(5 + 4) -> 0(5 + 4 + 6)
우리 그러면 545층인 경우를 확인해 볼까요?
일의 자리를 올리면 십의 자리가 상승합니다.
545 -> 550 -> ?
일의 자리를 내리면 십의 자리가 그대로 입니다.
545 -> 540 -> ?
어떤게 더 이득인가요?
일의 자리를 내리는게 이득입니다.
일의 자리가 5이고, 십의 자리가 5 미만 이기 때문에 일의 자리를 내리는 게 이득 입니다.!👍
545 -> 540(5) -> 500(5 + 4) -> 0(5 + 4 + 5)
- 일의 자리 숫자(
oneDigit
)와 십의 자리 숫자(tenDigit
) 확인- 일의 자리 숫자(
oneDigit
)가 5보다 클 경우 올림- 일의 자리 숫자(
oneDigit
)가 5일 경우 십의 자리 숫자(tenDigit
)가 5 이상이면 올림, 5 미만이면 내림- 일의 자리 숫자(
oneDigit
)가 5보다 작을 경우 내림storey
를 10으로 나누고 위 과정 반복
- 10으로 나눠야 다음 루프에서 일의 자리(
oneDigit
), 십의 자리(tenDigit
)를 확인할 수 있음^^
class Solution {
public int solution(int storey) {
/**
* 주어진 숫자의 일의 숫자부터 확인해야 합니다.
*
* 1. 일의 자리 숫자와 십의 자리 숫자 확인
* 2. 일의 자리 숫자가 5보다 클 경우 올림
* 2.1 일의 자리 숫자가 5일 경우 십의 자리숫자가 5이상이면 올림, 5미만일 경우 내림
* 2.2 일의 자리 숫자가 5보다 작을 경우 내림
* 3. storey를 10으로 나누고 1~3 과정 반복
*/
int answer = 0;
while (storey > 0) {
// 일의 자리 숫자
int oneDigit = storey % 10;
// 십의 자리 숫자
int tenDigit = (storey / 10) % 10;
// 일의 자리 숫자가 5보다 크면
if(oneDigit > 5) {
// 일의자리 숫자만큼 돌 사용
answer += 10 - oneDigit;
// 올림
storey += 10;
}
// 일의 자리 숫자가 5 이면
else if(oneDigit == 5) {
// 5만큼 돌 사용
answer += 5;
// 십의 자리가 5이상이면 올림
if(tenDigit >= 5) {
storey += 10;
}
}
// 일의 자리 숫자가 5보다 작으면
else {
// 일의 자리 숫자만큼 돌 사용
answer += oneDigit;
}
// 10으로 나눔(나눠야 다음 루프일때 일의 자리, 십의 자리를 파악)
storey /= 10;
}
return answer;
}
}