🧠 문제 요약
- 주어진 수가 팰린드롬수인지 판별하는 문제
- 팰린드롬수란 앞에서부터 읽나 뒤에서부터 읽나 똑같은 수를 말한다
- 여러 개의 테스트 케이스가 주어지며, 입력의 마지막에 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문을 쓸때는 삼항연산자를 써야겠다!!
- 저 수학적 접근법....... 이해는 했지만 내가 코드를 짤순 없을듯;;;
반응형
'Study > Coding Test' 카테고리의 다른 글
[baekjoon] 이항계수1(JavaScript) (2) | 2025.08.15 |
---|---|
[beakjoon] 평균(JavaScript) (5) | 2025.08.14 |
[beakjoon] 웰컴 키트(JavaScript) (3) | 2025.08.12 |
[beakjoon] 직각삼각형(JavaScript) (2) | 2025.08.11 |
[beakjoon] 문자열 반복(JavaScript) (7) | 2025.08.09 |