CODE KATA #20

YoungToMaturity·2021년 2월 9일
0

CODE KATA 🧗‍♂️

목록 보기
20/37
post-thumbnail

회문 문자열

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

나의 풀이

            function solution(s){
                let answer="YES";
                let n = Math.floor(s.length/2);
                s = s.toLowerCase();
                for(i=0; i<n; i++) {
                    if(s[i] !== s[s.length-i-1]) answer="NO";
                }
                return answer;
            }
            
            let str="goooG";
            console.log(solution(str));

정답 풀이

            function solution(s){
                let answer="YES";
                s=s.toLowerCase();
                if(s.split('').reverse().join('')!=s) return "NO";    
                return answer;
            }
            
            let str="gooG";
            console.log(solution(str));

배울 점

정답 풀이의 경우, split('')을 통해 각 글자를 하나하나 떼어놓은 상태의 array를 만든 후에, .reverse()를 통해서 해당 array를 역순으로 정리하고, join('')을 통해 array를 하나의 문자열로 통일시켰다.

유효한 팰린드롬

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다. 알파벳 이외의 문자들의 무시합니다.

나의 풀이

            function solution(s){
                let answer="YES";
                let word = "";
                for(i=0; i<s.length; i++) {
                    let x = s.toLowerCase().charCodeAt(i);
                    if(65<=x && x <= 90) word+=s[i];
                }
                if(word.split('').reverse().join('')!=word) answer="NO";
                return answer;
            }
            
            let str="found7, time: study; Yduts; emit, 7Dnuof";
            console.log(solution(str));

정답 풀이

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

배울 점

나의 풀이의 경우, for문과 charCodeAt을 통해서 s의 각 글자의 영문 소문자 여부를 파악하였지만, 정답 풀이의 경우 정규 표현식을 이용하여 영문 소문자 여부를 확인하였다.

[^xyz]
부정 문자셋(negated character set) 또는 보충 문자셋(complemented character set)입니다. 괄호 내부에 등장하지 않는 어떤 문자와도 대응됩니다. 하이픈을 이용하여 문자의 범위를 지정할 수 있습니다. 일반적인 문자셋에서 작동하는 모든 것은 여기에서도 작동합니다.
예를 들어, 패턴[^abc]는 패턴[^a-c]와 동일합니다. 두 패턴은 "brisket"의 'r', "chop."의 'h' 에 대응됩니다.

숫자만 추출

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만 듭니다.
만약 “tge0a1h205er”에서 숫자만 추출하면 0, 1, 2, 0, 5이고 이것을 자연수를 만들면 1205 이 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

나의 풀이

            function solution(str){
                let answer="";
                answer = str.toLowerCase().replace(/[a-z]/g, '');
                return parseInt(answer);
            }
            
            let str="g0en2T0s8eSoft";
            console.log(solution(str));

정답 풀이

            function solution(str){
                let answer="";
                for(let x of str){
                    if(!isNaN(x)) answer+=x;
                }  
                return parseInt(answer);
            }
            
            let str="g0en2T0s8eSoft";
            console.log(solution(str));

참고할 점

나의 풀이에서 정규식을 통해서 처리한 부분을 정답 풀이에서는 isNaN()을 활용하였다. 나의 풀이의 경우는 해당 결과를 도출하기 위하여 toLowerCase()replace()를 두번 처리해야하기 때문에 isNaN()을 활용하는 것이 더 효율적일 것 같다. (정확한 비교가 필요할 것 같다)

profile
iOS Developer

0개의 댓글