본문 바로가기

Study/Coding Test

[beakjoon] 팰린드롬수(JavaScript)

📘 오늘의 코딩테스트 - 팰린드롬수(JavaScript)

🔢 문제 번호: 1259

🔗 문제 링크: 백준 - 팰린드롬수

 

 

 

 

🧠 문제 요약

  • 주어진 수가 팰린드롬수인지 판별하는 문제
  • 팰린드롬수란 앞에서부터 읽나 뒤에서부터 읽나 똑같은 수를 말한다
  • 여러 개의 테스트 케이스가 주어지며, 입력의 마지막에 0이 나오면 프로그램 종료
  • 무의미한 0이 앞에 올 수 없다는 조건이 있음
    • 입력:
      • 여러 줄에 걸쳐 1 이상 99999 이하의 정수가 주어짐
      • 마지막 줄에 0이 주어지면 종료 (이 줄은 처리하지 않음)
    • 출력: 각 줄마다 팰린드롬수면 'yes', 아니면 'no'를 출력

 

 

 

✅ 실행 예시 및 결과

입력:
121
1231
12421
0

출력:
yes
no
yes

 

 

 

✍️ 내 풀이

  • 문자열 변환과 배열의 reverse() 메서드를 사용
  • 각 숫자를 문자열로 받아서 문자 단위로 분리한 후, 배열을 뒤집어서 다시 합침
  • 원본 문자열과 뒤집은 문자열을 비교하여 같으면 팰린드롬으로 판별
  • 0이 입력되면 break문으로 반복을 종료

 

 

 

💻 내가 푼 코드

const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

for(let i = 0; i < input.length; i++) {
    if(input[i] === '0') break;
    
    const strArray = input[i].split('');
    const reverseArray = strArray.reverse().join('');
    
    if(input[i] === reverseArray) {
        console.log('yes')
    } else {
        console.log('no')
    }
}

 

 

 

📎 남이 푼 코드

// 수학적 접근법 - 가장 효율적
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

function isPalindrome(x) {
    let original = x, reversed = 0;
    while (x > 0) {
        reversed = reversed * 10 + x % 10;
        x = Math.floor(x / 10);
    }
    return original === reversed;
}

for(let i = 0; i < input.length; i++) {
    const num = parseInt(input[i]);
    if(num === 0) break;
    console.log(isPalindrome(num) ? 'yes' : 'no');
}
  • 문자열로 변환하지 않고 순수 수학 연산으로만 해결
  • x % 10으로 마지막 자리 숫자를 추출
  • reversed = reversed * 10 + (x % 10)으로 거꾸로 뒤집은 숫자를 만들어감
  • x = Math.floor(x / 10)으로 마지막 자리를 제거
  • 예시: 121 → 1, 12, 1 순서로 추출하여 → 1, 12, 121로 뒤집어서 만듦
  • 메모리 사용량 80% 절약, 실행 속도 40% 향상
  • 문자열 생성과 배열 메서드 호출 오버헤드를 완전히 제거

 

 

 

🔍 회고 & 배운 점

  • 문자열 처리의 기본기를 다질 수 있는 문제!!
  • 처음에 split(' ')고 join(' ')을 사용해서 공백 때문에 비교가 제대로 안됐지만 공백을 없애서 다시 잘 풀었다!!
  • 다음부터는 if문을 쓸때는 삼항연산자를 써야겠다!!
  • 저 수학적 접근법....... 이해는 했지만 내가 코드를 짤순 없을듯;;;
반응형