2022/01/04) 1. 회문문자열 [문자열 탐색]

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

1. 문제

<회문 문자열>
: 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 한다. 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 "NO"를 출력하는 프로그램을 작성한다. 단 회문을 검사할 때 대소문자를 구분하지 않는다.

2. 해결 방법

  1. 대소문자는 구분하지 않는다고 하니, toLowerCase() 혹은 toUpperCase()를 이용해 소문자 혹은 대문자로 변경해준다.
  2. 특정 파라미터 값을 주지 않고 split('')을 쓰면, 문자열이 배열로 바뀐다. 이 바뀐 배열에 배열 함수인 reverse()를 써서 순서를 바꾸어 준 다음, join('')으로 배열을 다시 문자열로 만들어 준다.
  3. good이나 goaod이나 문자열의 길이는 다르나, 구해야 하는 방식은 똑같다. goaod일 경우엔, 중간꺼를 제외하고 서로 비교하면 되기 때문이다.
    결국 good도 총 2번, goaod도 총 2번 구하면 된다. 이 말은 곧 for문으로 하나 하나씩 비교한다고 할 때, 돌리는 개수가 같다는 말이다.

! 정리

  • split('') : 문자열을 배열로 바꿔줌
  • join('') : 배열들을 문자열로 바꿔줌(합쳐서)
  • reverse() : 배열을 역순으로 해줌
  • 한 번 더 정리 : srj~ 문자열을 배열로 바꾼 후, 역순으로 한 다음, 다시 배열을 문자열로~ 이느낌 rjrj~

3. 정답

        <script> //직접 비교
            function solution(s){ 
                let answer="YES"; //split로 배열로 만든 후 reverse로 돌린다음에 문자열로 다시 변경
                s = s.toLowerCase();
                if(s.split('').reverse().join('') !== s) return "No"    
                return answer;
            }
            let str="gdooog";
            console.log(solution(str));
        </script>
        <script> //문자열인데 신기하게 for문에서 인덱스번호로 접근이 가능하다! 마치 for..of때처럼!
            function solution(s){ 
                let answer="YES";
                s = s.toLowerCase();
                let len = s.length;
                for(let i = 0; i < Math.floor(len/2); i++ ){ //다른 걸 확인한다!! 만약 다르면 바로 NO리턴, 같아서 다 통과하면 ANSWER리턴
                    if(s[i] !== s[len-i-1]) return "NO";
                }
                return answer;
            }
            let str="goooG";
            console.log(solution(str));
        </script>
profile
아자아자 파이띵굥!

0개의 댓글