문제
주어진 문자열이 회문이면 true를 반환, 아니면 false를 반환하다.
영숫자가 아닌 문자들(non-alphanumeric characters)은 제거되어야 한다.
대소문자 구분도 없어야 한다.
나의 풀이
function palindrome(str) {
let alphanumeric = /[a-z]|[0-9]/gi;
str = str.match(alphanumeric);
for(let i = 0; i < str.length; i++){ //소문자 변경
if(str[i].toUpperCase()) str[i] = str[i].toLowerCase();
}
let cnt = 0;
if(str.length % 2 === 1){ //str의 길이가 홀수일 때
for(let i = 0; i < str.length/2-1; i++){
if(str[i] === str[str.length-i-1])
cnt++;
}
} else{ //str의 길이가 짝수일 때
for(let i = 0; i < str.length/2; i++){
if(str[i] === str[str.length-i-1])
cnt++;
}
}
if(cnt === Math.floor(str.length/2)) return true;
return false;
}
if, else문 안의 코드가 상당히 겹쳐서 불편하다.
어떻게든 줄이고 싶은데 이미 해설을 보고 더 좋은 코드를 발견하여 이대로 놔두었다.
나의 풀이는 직관적이라고 생각한다.
alphanumeric은 정규식을 이용하여 두 번째 줄에 선언해주었다.
그 후 주어진 문자열 str에서 매치가 되는(조건에 만족하는) 문자들만 다시 str에 저장했다.
반복문으로 대문자는 소문자로 만들어주었다.
str의 길이가 홀수일 때, 영숫자를 주어진 문자열/2-1 만큼 돌며 회문 조건을 만족할 때 cnt를 증가해주었다.
str의 길이가 짝수일 때는 영숫자를 주어진 문자열/2 만큼 돌며 위와 같은 일을 한다.
그 후 cnt가 str 길이의 절반을 내림차순 한 것과 같으면 true, 아니면 false를 반환한다.
다른 풀이
function palindrome(str) {
return (
str.replace(/[\W_]/g, "").toLowerCase() ===
str
.replace(/[\W_]/g, "")
.toLowerCase()
.split("")
.reverse()
.join("")
);
}
코드가 정말 간단해서 놀랬다...! reverse()를 사용해서 회문인지 검사했다.
나는 str를 애초에 배열로 접근해서 생각했는데, 간단히 문자열로 풀 수 있었다....
항상 알고리즘을 풀 때 복잡하게 생각하는 경향이 있는데 조금 쉽게 생각해야겠다..
JavaScript Algorithms and Data Structures Projects: Palindrome Checker
(문제 출처:www.freecodecamp.org)
'알고리즘 > FreeCodeCamp' 카테고리의 다른 글
[자바스크립트/알고리즘] 휴대폰 번호 검증 (정규식) (0) | 2021.02.04 |
---|---|
[자바스크립트/알고리즘] 2진수 문자열을 영어로 변환 (0) | 2021.02.03 |
[자바스크립트/알고리즘] flat 함수 대안 (0) | 2021.02.03 |
[자바스크립트/알고리즘] 프리코드캠프(FCC) - Drop it : 함수가 true일 때 까지 요소 제거 (shift) (0) | 2021.02.02 |
[자바스크립트/알고리즘] 배열 여러개를 합친 후 유일한 값 반환하기 (set 객체, flat 함수) (0) | 2021.02.01 |