ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션3
    Algorithm 2022. 2. 6. 16:18

     

    *5문제 모두 풀었음 (22.02.06)

     

    1) 회문 문자열

    문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력 하는 프로그램을 작성하세요.

    단 회문을 검사할 때 대소문자를 구분하지 않습니다.

    function solution(s) {
        let answer = "YES";
        let n = str.length;
        for (let i = 0; i < Math.floor(n/2); i++) { 
            if (str[i].toUpperCase() !== str[n - i - 1].toUpperCase()) { // 대문자로 바꿔서 비교
                answer = "NO";
                break;
            } 
        }
        return answer;
    }
    
    let str = "goooG";
    console.log(solution(str));

     

    *강사님 코드

    👉s = s.toLowerCase() 를 하면 s 가 한 번에 소문자로 바뀜!

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

     

    - reverse 사용한 방식

     function solution(s){
        let answer="YES";
        s=s.toLowerCase();
         if (s.split('').reverse().join('') !== s) // s를 revserse 시킨 후 s와 비교
             return "NO";
        return answer;
    }
    
    let str="goooG";
    console.log(solution(str));

     

     

    2) 유효한 팰린드롬

    - 이 문제의 포인트는 정규식을 사용하는 것!

    function solution(s){
        let answer="YES";
        let regEng = /[^A-Za-z]/g; // 영문이 아닌 것
        let revisedStr = s.replace(regEng, "");
        let len = revisedStr.length;
        for (let i = 0; i < len; i++) {
            if (revisedStr[i].toUpperCase() !== revisedStr[len - i - 1].toUpperCase())
                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));

     

     

    3) 숫자만 추출

    function solution(str) {
        let answer = "";
        for (let i = 0; i < str.length; i++) { 
            let num = parseInt(str.charCodeAt(i)); 
            if (num > 47 && num < 58) // 48 ~ 57 -> 아스키 10진수로 숫자
                answer += str[i];
        }
        if (answer[0] == "0") // 0208과 같이 첫 문자가 0일 때 
            answer = answer.slice(1);
    
        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));

     

    - return하면서 parseInt 안쓰는 방법

     function solution(str){
        let answer=0;
        for(let x of str){
            if (!isNaN(x))
                answer = answer * 10 + Number(x); // 처음에 0이면 계속 0이고, 그 후 2 = 0*10+2 와 같이
        }  
        return answer;
    }
    
    let str="g0en2T0s8eSoft";
    console.log(solution(str));

     

     

    4) 가장 짧은 문자거리

    function solution(s, t) {
        let answer = [];
        let tempList = []; // t의 인덱스를 담을 배열
        let min = 0;
        for (let i = 0; i < s.length; i++) { 
            if (s[i] === t) 
                tempList.push(i);
        }
        for (let i = 0; i < s.length; i++) { 
            if (s[i] !== t) { // t와 같지 않은 값인 경우
                min = Number.MAX_SAFE_INTEGER
                for (let j = 0; j < tempList.length; j++) {
                    if (Math.abs(s.indexOf(s[i]) - tempList[j]) < min) { // s 요소들의 인덱스와 t 인덱스 차의 절대값이 min 보다 작을 경우         
                        min = Math.abs(s.indexOf(s[i]) - tempList[j]); // 해당 값을 min에 담음
                    }
                }
                answer.push(min);
            } else { // t와 같은 값인 경우 0을 넣어줌
                answer.push(0);
            }
        }
        return answer;
    }
    
    let str = "teachermode";
    console.log(solution(str, 'e')); 
    /*
    [
      1, 0, 1, 2, 1,
      0, 1, 2, 2, 1,
      0
    ]
    */

     

    내가 풀이한 방법 이미지화

     

    *강사님 코드

    - 왼쪽부터 한 번 돌면서 e 만났을 때 0 그 후 e 만날 때까지 p++

    - 위의 방법을 오른쪽부터 한 번 더 돌면서 min 값으로 변경

    function solution(s, t){
        let answer=[];
        let p=1000;
        for(let x of s){
            if(x===t){
                p=0;
                answer.push(p);
            }
            else{
                p++;
                answer.push(p);
            }
        }
        p=1000;
        for(let i=s.length-1; i>=0; i--){
            if (s[i] === t)
                p = 0;
            else{
                p++;
                answer[i]=Math.min(answer[i], p);
            }
        }
        return answer;
    }
    
    let str="teachermode";
    console.log(solution(str, 'e'));

     

     

     

    5) 문자열 압축

    function solution(s) {
        let answer = "";
        let cnt = 1;
        for (let i = 0; i < s.length; i++) { 
            if (s[i] == s[i + 1]) {
                cnt++;
            } else { 
                if(cnt !== 1)
                    answer += s[i] + cnt;
                else
                    answer += s[i];
                cnt = 1;
            }
        }
        return answer;
    }
    
    let str = "KKHSSSSSSSE";
    console.log(solution(str)); //K2HS7E

     

    *강사님 코드

    function solution(s){
        let answer="";
        let cnt=1;
        s=s+" ";
        for(let i=0; i<s.length-1; i++){ // s.length-1 -> s=s+" "; 로 하나 더 늘려서 -1 해줌
            if(s[i]===s[i+1]) cnt++;
            else{
                answer+=s[i];
                if(cnt>1) answer+=String(cnt);
                cnt=1;
            }
        }
        return answer;
    }
    
    let str="KKHSSSSSSSE";
    console.log(solution(str));

     

     

     

    댓글

Designed by Tistory.