<유효한 팰린드롬>
: 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 한다. 문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 "NO"를 출력하는 프로그램을 작성한다.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않는다. 알파벳 이외의 문자들은 무시한다.
명심!! 알파벳(대소문자 구분x)을 제외한 나머지 문자는 무시한다!!
- 첫 번째 방법 : 문자열을 대문자 혹은 소문자로 바꾸고, replace와 정규표현식을 사용하여 알파벳만 남도록 한다. 그리하여 이 값과, 이 값을 역순으로 한 값을 비교하여, 일치하지 않으면 "NO"를 리턴한다.
- 두 번째 방법 : 위에서는 알파벳을 제외한 모든 것들을 없앨 때, replace와 정규표현식으로 하였지만, 아스키코드를 이용하여 할 수도 있다. 먼저 문자열을 만약 대문자로 바꾸어 준다.
그 후 for..of문을 돌리는데, 먼저 값을 아스키코드로 바꿔준다. 그리고 이 값(아스키코드)이 65-90에 해당하면 변수에 값(원래문자)을 저장한다. (특수문자나 공백(97-65=32)은 저 범위에 해당하지 않으므로, 변수에 저장될 수 없음. 그러므로 알파벳만 추출가능!!)
그 다음엔 첫 번째 방법과 같이, 이 값과 이 값을 역순으로 한 값을 비교하여, 일치하지 않으면 'NO'를 리턴한다.
<script> //첫 번째 방법 function solution(s){ let answer="YES"; s=s.toLowerCase().replace(/[^a-z]/g, ''); if(s.split('').reverse().join('')!==s) return "NO"; return answer; } let str="found7, time: study; Yduts; emit, 7Dnuof"; console.log(solution(str)); </script>
<script> function solution(s){ let answer="YES" let res=""; s=s.toLowerCase(); for(let x of s){ let num=x.charCodeAt(); if(num>=97 && num<=122) res+=x; } if(res.split('').reverse().join('')!==res) return "NO"; return answer; } let str="found7, time: study; Yduts; emit, 7Dnuof"; console.log(solution(str)); </script>
문제를 좀 제대로 읽자. 그리고 정규표현식 부분을 몇 번이나 공부해놓고 복습안해서 까먹는게 정상이냐 ㅜ 제발 좀.. 정규표현식은 '/패턴/플래그' 다. 이거라도 기억해라. 추가로 '/[^]/g' 이까지만 기억해라.