본문 바로가기
Algorithm

[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션3

by Baest 2022. 2. 6.

 

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