function solution(storey) {
let stor = "" + storey
let result = 0
for (let i = stor.length - 1; i >= 0; i -= 1) {
const digit = 10 ** (stor.length - 1 - i) // 단위
const diff = stor[i] >= 5 ? 10 - +stor[i] : +stor[i] // 더 적은 차이값 이용
result += diff
const [inc, dec] = ["" + (+stor + diff * digit), "" + (+stor - diff * digit)]
if (stor[i] == 5) { // 현재층이 5인 경우 그 앞자리를 고려해 올라갈지 내릴지를 결정
if (i - 1 >= 0 && stor[i - 1] >= 5) stor = inc
else stor = dec
}
else if (stor[i] > 5) { // 현재층이 5이상이면 올라가기
stor = inc
if (stor.length > ("" + storey).length) ++i
}
else stor = dec // 현재층이 5미만이면 내려가기
}
return result
}
구현 로직 (구현)
storey의 가장 오른쪽 값부터 계산해가며 올라갈지 내려갈지를 결정합니다.
1. 차이값 계산, 현재 층이 5이상이면 10 - 현재층 값을, 5미만이면 그대로 사용합니다.
2. 올라가고난 후의 값과 내려가고 난 후의 값 inc와 dec를 미리 구해줍니다. (굳이 그럴필요는 없지만 가독성을 위해)
3. 현재 층에 따라 올라갈지 내려갈지를 계산합니다.
3-1. 현재 층이 6이상이면 올라가는 것이 득이므로 stor를 그만큼 증가시킵니다. 만약 증가되어 자릿수가 증가했다면 인덱스도 증가시킵니다. 예를 들면 첫째자리가 9인 경우가 되겠습니다.
3-2. 현재 층이 6미만이면 내려가는 것이 득이므로 stor를 그만큼 감소시킵니다.
3-3. 현재 층이 5이면 그 앞자리를 고려해 결정합니다. 앞자리가 5이상이면 증가시키고 5미만이면 감소시킵니다. 예를 들면 stor가 545 일 때, 앞자리가 4이기 때문에 내려가게 되면 545 -> 540 -> 500 -> 0 으로 가서 14만 사용해도 됩니다.