문제 정의
첫 번째이자 유일한 인수로 숫자 num을 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 회문(palindrome)을 얻기 위해 필요한 '특별한 단계'의 횟수를 반환해야 합니다. 여기서 말하는 특별한 단계란 "자릿수를 뒤집은 숫자를 원래 숫자에 더하는 것"입니다. 만약 그 결과가 회문이 아니라면, 결과값이 회문이 될 때까지 합산된 수를 대상으로 동일한 과정을 반복합니다.
예를 들어 함수에 다음과 같이 입력한다고 가정해 보겠습니다.
입력
const num = 87;
출력
const output = 4;
출력 설명
결과가 4인 이유는 다음과 같은 단계가 진행되기 때문입니다.
87 + 78 = 165; 165 + 561 = 726; 726 + 627 = 1353; 1353 + 3531 = 4884
마지막 값인 4884는 앞에서 읽으나 뒤에서 읽으나 같은 회문이므로, 총 4번의 단계가 필요하게 됩니다.
구현 코드
다음은 위 문제를 해결하는 전체 코드입니다.
const num = 87;
const countSteps = (num) => {
let res = 0;
while (!isPalindrome(num)) {
res++
num += +('' + num).split``.reverse().join``
};
return res;
}
const isPalindrome = num => {
let i = 0
let str = '' + num
while (i++ <= str.length / 2) {
if (str[i] !== str[str.length - 1 - i]) return false
};
return true
}
console.log(countSteps(num));
코드 설명
이 코드의 핵심 로직은 두 가지 함수로 나눌 수 있습니다.
- isPalindrome 함수: 숫자를 문자열로 변환한 뒤, 문자열의 앞쪽 문자와 뒤쪽 문자를 중앙까지 하나씩 비교하여 회문 여부를 판별합니다. 한 쌍이라도 일치하지 않으면 즉시 false를 반환하고, 모두 일치하면 true를 반환합니다.
- countSteps 함수: 현재 숫자가 회문이 아닌 동안 while 루프를 돌며 단계 카운트(res)를 1씩 증가시키고, 숫자를 뒤집은 값을 원래 값에 더합니다. 회문이 되는 순간 누적된 단계 횟수를 반환합니다.
여기서 +('' + num).split``.reverse().join`` 부분은 숫자를 문자열로 만들고 → 각 자릿수로 분리한 뒤 → 배열을 역순으로 뒤집고 → 다시 하나의 문자열로 합친 후 → 단항 연산자 +를 통해 숫자로 변환하는 과정을 한 줄로 처리한 것입니다.
실행 결과
4