숫자 n을 입력받아 해당 숫자와 가장 가까운 회문(palindrome)을 반환하는 함수 nearestPalindrome()을 작성해야 합니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 같은 숫자나 문자열을 의미합니다.
예시
입력 숫자가 264라면 출력은 262가 되어야 합니다.
입력 숫자가 7834라면 출력은 7887이 되어야 합니다.
접근 방식
기본적인 아이디어는 다음과 같습니다. 숫자를 문자열로 변환한 뒤 길이를 기준으로 두 부분으로 나누고, 앞쪽 절반을 뒤집어 뒤에 이어 붙여 새로운 회문을 만듭니다. 즉, 왼쪽 절반을 오른쪽에 거울처럼 반사시키는 방식입니다.
예를 들어 23534의 경우 앞쪽 세 자리인 235를 가져오고, 나머지 두 자리인 34 대신 235의 역순인 32를 붙여 23532라는 회문을 얻습니다.
예제 코드
const findNearestPalindrome = num => {
const strNum = String(num);
const half = strNum.substring(0, Math.floor(strNum.length/2));
const reversed = half.split("").reverse().join("");
const first = strNum.length % 2 === 0 ? half : strNum.substring(0,
Math.ceil(strNum.length/2))
return +(first+reversed);
};
console.log(findNearestPalindrome(235));
console.log(findNearestPalindrome(23534));
console.log(findNearestPalindrome(121));
console.log(findNearestPalindrome(1221));
console.log(findNearestPalindrome(45));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
232 23532 121 1221 44
코드 동작 원리
- 숫자 → 문자열 변환:
String(num)으로 입력 숫자를 문자열로 바꿔 자릿수 단위 조작이 가능하게 만듭니다. - 절반 계산:
Math.floor(strNum.length / 2)로 전체 길이의 절반 지점을 구하고,substring()으로 앞쪽 절반(half)을 추출합니다. - 뒤집기:
split(""),reverse(),join("")을 연달아 사용해 추출한 절반을 역순으로 뒤집습니다. - 홀수 길이 처리: 길이가 홀수일 때는 중간 자릿수까지 포함한
first(예: 235의 경우 "23")를 사용하고, 짝수일 때는half를 그대로 사용합니다. - 회문 조립:
first와reversed를 이어 붙인 뒤 단항 덧셈 연산자+로 다시 숫자형으로 변환하여 반환합니다.
주의 사항
이 방법은 구현이 매우 간단하지만, 왼쪽 절반을 무조건 미러링하기 때문에 모든 경우에 수학적으로 '가장 가까운' 회문을 보장하지는 않습니다. 예를 들어 199를 입력하면 이 함수는 191을 반환하지만, 실제로 더 가까운 회문은 202입니다(|199 − 191| = 8 > |202 − 199| = 3). 따라서 엄밀한 최근접 회문이 필요한 경우에는 미러링된 값과 함께 그보다 큰 값·작은 값에서 만든 후보 회문을 추가로 생성해 거리를 비교하는 로직을 보완하는 것이 좋습니다.