2022/01/05) 2. 유효한 팰린드롬 [문자열 탐색]

굥굥이·2022년 1월 5일
0
post-thumbnail

1. 문제

<유효한 팰린드롬>
: 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 한다. 문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 "NO"를 출력하는 프로그램을 작성한다.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않는다. 알파벳 이외의 문자들은 무시한다.
명심!! 알파벳(대소문자 구분x)을 제외한 나머지 문자는 무시한다!!

2. 해결 방법

  1. 첫 번째 방법 : 문자열을 대문자 혹은 소문자로 바꾸고, replace와 정규표현식을 사용하여 알파벳만 남도록 한다. 그리하여 이 값과, 이 값을 역순으로 한 값을 비교하여, 일치하지 않으면 "NO"를 리턴한다.
  2. 두 번째 방법 : 위에서는 알파벳을 제외한 모든 것들을 없앨 때, replace와 정규표현식으로 하였지만, 아스키코드를 이용하여 할 수도 있다. 먼저 문자열을 만약 대문자로 바꾸어 준다.
    그 후 for..of문을 돌리는데, 먼저 값을 아스키코드로 바꿔준다. 그리고 이 값(아스키코드)이 65-90에 해당하면 변수에 값(원래문자)을 저장한다. (특수문자나 공백(97-65=32)은 저 범위에 해당하지 않으므로, 변수에 저장될 수 없음. 그러므로 알파벳만 추출가능!!)
    그 다음엔 첫 번째 방법과 같이, 이 값과 이 값을 역순으로 한 값을 비교하여, 일치하지 않으면 'NO'를 리턴한다.

3. 정답

        <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>

4. 내 코드와 비교 그리고 반성

문제를 좀 제대로 읽자. 그리고 정규표현식 부분을 몇 번이나 공부해놓고 복습안해서 까먹는게 정상이냐 ㅜ 제발 좀.. 정규표현식은 '/패턴/플래그' 다. 이거라도 기억해라. 추가로 '/[^]/g' 이까지만 기억해라.

profile
아자아자 파이띵굥!

0개의 댓글