JavaScript 알고리즘 문자열 탐색 문제풀이

Hyodduru ·2022년 2월 2일
0

Algorithm

목록 보기
4/25
post-thumbnail

문자열 탐색

1. 회문 문자

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

  function solution(str) {
  //나의 풀이
  let answer = "YES";
  let string = str.toUpperCase().trim();
  for (let i = 0; i < str.length; i++) {
    if (string[i] === string[str.length - i - 1]) answer = "YES";
    else answer = "NO";
  }

  //reverse 활용한 풀이
  let answer ="YES";
  str= str.toUpperCase();
  let reversedString = string.split('').reverse().join('');
  if(str !== reversedString)return 'NO'

  //선생님 풀이
    let answer = "YES";
    str = str.toLowerCase();
    let len = str.length;
    for (let i = 0; i < Math.floor(len / 2); i++) {
      if (str[i] !== str[len - i - 1]) return "NO";
    }

    return answer;
  }     
  console.log(solution("gooG")); // YES
  

🚨 유의) str 뒤에 바로 reverse를 붙혀서는 안된다. 배열의 method를 string에 적용하고 싶다면 꼭 split을 써서 여러개의 문자열로 나누어줄 것(문자의 배열화). 그리고 join()을 써줌으로써 다시 string으로 반환할 것!!

2. 유효한 팰린드롬

팰린드롬 : 회문 문자
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하기.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않는다. 알파벳 이외의 문자들의 무시한다.

   function solution(s) {
    // 선생님 풀이
    let answer = "YES";
    s = s.toLowerCase().replace(/[^a-z]/g, ""); // ^ = 부정(not)의 의미
    if (s.split("").reverse().join("") !== s) return "NO";
    console.log(s);

    return answer;
  }
  console.log(solution("found7, time: study; Yduts; emit, 7Dnuof")); //YES

⭐️ 핵심 포인트) replace 활용하기!

3. 숫자만 추출

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수 만드는 프로그램을 만들기

  function solution(s) {
  나의 풀이
  let answer;
  s = s.replace(/[^0-9]/g, "");
  answer = s;

  선생님 풀이
    let answer = "";
    for (let x of s) {
      if (!isNaN(x)) answer += x;
    }

    return parseInt(answer);
  }
  console.log(solution("g0en2T0s8eSoft")); //208

⭐️ 0208 과 같은 숫자 앞의 0 없애주기 위해서는 parseInt를 사용함으로써 정수화 시켜주면 된다.
⭐️ 숫자 data type 확인할 시 isNaN 활용 가능

4. 가장 짧은 문자거리

한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하기

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

  console.log(solution("teachermode", "e")); // 10121012210

⭐️ 시간복잡도 f(n)문제
⭐️ 앞에서 뒤로, 뒤에서 앞으로 구한 p중 최솟값들로 answer 출력하기

5. 문자열 압축

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하기. 단 반복횟수가 1인 경우 생략.

  function solution(s) {
    나의 풀이
    let answer = "";
    let p = 1;
    answer += s[0];
    for (let i = 1; i < s.length; i++) {
      if (s[i] === s[i - 1]) {
        p++;
      } else {
        if (p > 1) answer += p;
        p = 1;
        answer += s[i];
      }
    }

    선생님 풀이
    let answer = "";
    let cnt = 2;
    s = s + " ";
    for (let i = 0; i < s.length; i++) {
      if (s[i] === s[i + 1]) cnt++;
      else {
        answer += s[i];
        if (cnt > 1) answer += String(cnt);
        cnt = 1;
      }
    }

    return answer;
  }

  console.log(solution("KKHSSSSSSSE")); //K2HS7E
profile
꾸준히 성장하기🦋 https://hyodduru.tistory.com/ 로 블로그 옮겼습니다

0개의 댓글