이안의 평일코딩

[JS] 문자열탐색 (회문, 팰린드롬, 추출, 최단거리, 압축) 본문

Study/JS Algorithm Rocket

[JS] 문자열탐색 (회문, 팰린드롬, 추출, 최단거리, 압축)

이안92 2021. 5. 25. 13:24
반응형

회문문자열
<script>
  // 홀수일때도 짝수일때도 동일함 Math.floor 소수점 내림
  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";
    }

    // 두번째 방법
    // .split('') 문자 한개씩 배열이 됨 ["g", "o", "o", "o", "g"]
    // .reverse() 뒤집음
    // .join('') string으로 다시 묶음
    if(s.split('').reverse().join('')!=s) return "NO";  
    
    return answer;
  }

  let str="goooG";
  console.log(solution(str));
</script>

 

팰린드롬

 

.split('') 문자 한개씩 배열이 됨 ["g", "o", "o", "d"]
.reverse() 뒤집음
.join('') string으로 다시 묶음 good

<script>
  function solution(s){
    let answer="YES";
    // 문제에 알파벳 이외의 문자는 무시한다고 기재되어있었으므로
    // .replace() 소문자 알파벳 아닌것들 찾아서 빈문자로 바꿈
    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(str){
    let answer="";
    // isNaN() 숫자면 거짓, 숫자가 아니면 참
    for(let x of str){
      if(!isNaN(x)) answer+=x; // !isNaN() 숫자면 참
    }
    return parseInt(answer); // 0208 -> 208
  }

  let str="g0en2T0s8eSoft";
  console.log(solution(str));
</script>

 

가장 짧은 문자거리
<script>
  function solution(s, t){
    let answer=[];
    let p=1000;
    // 왼쪽에서 오른쪽으로 먼저 문자열 탐색
    // [1001, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0]
    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);
        // 기존 answer[i]값과 p값 중 작은 값을 넣음
      }
    }
    return answer;
  }

  let str="teachermode";
  console.log(solution(str, 'e')); // e와의 최단거리
</script>

 

문자열 압축
<script>
  function solution(s){
    let answer="";
    let cnt=1;
    s=s+" ";
    for(let i=0; i<s.length-1; i++){
      if(s[i]===s[i+1]) cnt++;
      else{
        answer+=s[i];
        if(cnt>1) answer+=String(cnt);
        cnt=1;
      }
    }

    return answer;
  }

  let str="KKHSSSSSSSE"; // K2HS7E
  console.log(solution(str));
</script>
반응형
Comments