
storey의 뒤에서부터 살펴보기 위해 %10을 해준다. 그리고 그 다음 값을 계산해주기 위해 /10을 해준다. storey가 0이 되기 전까지 반복한다.
5보다 작으면(0,1,2,3,4) 내림버튼을 누르는 것이 효율적이다.
-> 만약 12층이라면 -10 1번, -1 2번 총 3번이 정답이다.
-10 2번, +1 8번 눌러도 12층이 되지만 위의 방법보다 횟수가 훨씬 많다.
내림버튼: n
5보다 크면(6,7,8,9) 올림버튼을 누르는 것이 효율적이다.
-> 만약 16층이라면 -10 2번, +1 4번 총 6번이 정답이다.
-10 1번, -1 6번 총 7번이기 때문에 정답이 아니다.
여기서 가장 중요한 부분은 버튼을 한번 더 눌러서 거슬러 올라가는 것이기 때문에 +1을 해주어야 한다
16층일 때, 20에서 4를 거슬러 오는 것이므로 1->2이 되어야 한다는 뜻이다.
올림버튼: 10-n
만약 5라면 앞의 숫자로 판단한다.
3-1. 5 앞의 숫자가 5보다 크거나 같다면(5,6,7,8,9) 이것은 절반보다 크다는 뜻이다. 그러므로 올림버튼을 누르는 것이 효율적이다.
-> 만약 65층이라면, -100 1번 +10 3번, +1 5번 총 9번이 정답이다.
내림버튼을 누른다면 -10 6번, -1 5번 총 11번이기 때문에 정답이 될 수 없다.
여기서도 버튼을 한번 더 눌러서 거슬러 올라가는 것이기 때문에 +1을 해주어야 한다.
이때 5까지 포함된 이유는 55와 같은 경우는 100/2=50보다 큰 수이기 때문이다. (이건 내 뇌피셜이다.)
올림버튼: 10-n
3-2. 앞의 숫자가 5보다 작다면(1,2,3,4) 내림버튼을 누르는 것이 효율적이다.
-> 만약 25층이라면, -10 2번 -1 5번 총 7번이 정답이다.
-100 1번 +10 7번 +1 5번은 정답이 될 수 없다.
내림버튼: n
/*
storey = 현재 층 / 내가 가야하는 층: 0층
뒤에서부터 보기
0,1,2,3,4 -> - 버튼
6,7,8,9 -> + 버튼
5는 앞의 숫자와 합쳐서 판단
*/
import java.util.*;
class Solution {
public int solution(int storey) {
int answer = 0;
while(storey != 0) {
int n = storey % 10;
storey /= 10;
if(n < 5) {
answer += n;
}
else if(n > 5) {
answer += 10-n;
storey++; //더 크게 내려가서 뒷 숫자만큼 올라와야 하기 때문에 +1
}
else if(n == 5) {
//5 앞의 수가 5보다 크거나 같을 경우 더 큰 숫자로 내려갔다가 올라와야 함
if(storey % 10 >= 5) {
answer += 10-n;
storey++;
}
//5 앞의 수가 5보다 작은 경우 거기서 내려가야 함
else {
answer += n;
}
}
}
return answer;
}
}
힘겹게 정답.....
//5 앞의 수가 5보다 크거나 같을 경우 더 큰 숫자로 내려갔다가 올라와야 함
if(storey % 10 >= 5) {
answer += 10-n;
storey++;
}
//5 앞의 수가 5보다 작은 경우 거기서 내려가야 함
else {
answer += n;
}
사실 여기서 왜 >=5 인가 한참 생각했었다. 왜냐? 55로 계산하면 5를 포함하나 안하나 10으로 똑같이 나오거든;;
근데 555로 계산하니깐 >=5로 하는 게 맞더라
또 생각해보면 555는 1000/2 = 500보다 크다. 큰 수라 할 수 있지ㅎ
아무튼 이렇게 이해하면서 풀었다 끝!@
정말 머리 터질뻔한 문제였다. 설명도 내 머릿속에서 나온대로 적어서 뭘 제대로 적은지도 모르겠다...
내 스스로 푸는 관점이 0층에서 시작했다가 storey에서 시작했다가... 헷갈려서 딱 "storey에서 시작하는 거고 우리가 가야할 곳은 0이다!" 로 생각하고 풀었더니 좀 풀리기 시작하더라
구현은 어렵진 않았지만 풀이 방법이 어려웠다 흑