주어진 문자열이 팰린드롬인지 확인하라.
대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다.
My solution
대소문자를 구분하지 않으므로 모두 소문자로 바꿔주기 위해서 toLowercase()를 사용해야 한다.
영문자와 숫자만 대상으로 검사하면 되므로 그게 아닌 문자들을 모두 제거해주기 위해서 replace메서드를 정규표현식과 함께 사용한다.
replace를 거친 문자열을 배열화해서 reverse 메서드를 사용한다음 사용하기 전 문자열과 비교하면 팰린드롬인지 알 수 있을 것이다.
Code
function solution(s) {
const str = s.toLowerCase().replace(/[^a-z0-9]/g, '');
return str === str.split('').reverse().join('');
}
JavaScript
복사
Solution
1. 리스트
파이썬에서는 영문자와 숫자만 판별하기 위해서 char.isalnum() 메서드를 사용할 수 있다.
str이라는 배열을 스택처럼 사용해서 앞뒤로 꺼내면서 비교한다.
JS 풀이
function solution(s) {
const strs = [];
for (let i = 0; i < s.length; i++) {
if (s[i].match(/[a-zA-Z0-9]/)) {
strs.push(s[i].toLowerCase());
}
}
while (strs.length > 1) {
if (strs.pop() !== strs.shift()) return false;
}
return true;
}
JavaScript
복사
시간을 측정해보니 0.137 < 0.14s로 가독성도 안 좋고 조금 더 느린 것으로 나온다.
2. 데크
데크 자료형을 가져와서 사용하면 5배 가까이 속도를 높일 수 있다고 한다. popleft가 O(1)이므로 n번 반복하면 O(n)이기 때문에 리스트 O(n^2)보다 빠르다.
3. 슬라이싱 사용
정규식으로 불필요한 문자를 필터하고 슬라이싱해서 비교한 값을 반환한다. 내가 풀이한 것과 사실상 동일하다.
2번 데크보다 2배 속도를 높일 수 있다.
4. C 구현
char 포인터로 직접 조작하고, 필터링할 문자는 건너뛰는 식으로 구현해서 4ms가 걸린다.