Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트(JavaScript)로 가장 가까운 회문 찾기


숫자 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

코드 동작 원리

  1. 숫자 → 문자열 변환: String(num)으로 입력 숫자를 문자열로 바꿔 자릿수 단위 조작이 가능하게 만듭니다.
  2. 절반 계산: Math.floor(strNum.length / 2)로 전체 길이의 절반 지점을 구하고, substring()으로 앞쪽 절반(half)을 추출합니다.
  3. 뒤집기: split(""), reverse(), join("")을 연달아 사용해 추출한 절반을 역순으로 뒤집습니다.
  4. 홀수 길이 처리: 길이가 홀수일 때는 중간 자릿수까지 포함한 first(예: 235의 경우 "23")를 사용하고, 짝수일 때는 half를 그대로 사용합니다.
  5. 회문 조립: firstreversed를 이어 붙인 뒤 단항 덧셈 연산자 +로 다시 숫자형으로 변환하여 반환합니다.

주의 사항

이 방법은 구현이 매우 간단하지만, 왼쪽 절반을 무조건 미러링하기 때문에 모든 경우에 수학적으로 '가장 가까운' 회문을 보장하지는 않습니다. 예를 들어 199를 입력하면 이 함수는 191을 반환하지만, 실제로 더 가까운 회문은 202입니다(|199 − 191| = 8 > |202 − 199| = 3). 따라서 엄밀한 최근접 회문이 필요한 경우에는 미러링된 값과 함께 그보다 큰 값·작은 값에서 만든 후보 회문을 추가로 생성해 거리를 비교하는 로직을 보완하는 것이 좋습니다.