[문자열 탐색] 회문 문자열

Byungchan Park·2021년 10월 20일
0

회문 문자열

위와 같이, 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열이다.

문제 1.

문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 "NO"를 출력하는 프로그램을 작성하세요.
단 회문을 검사할 때 대소문자를 구분하지 않습니다.

예제1)

입력: chooHC
출력: YES

예제2)

입력: choogC
출력: NO

방법1) for 문을 이용한 문자열 접근 및 문자 비교

function solution(s) {
  let answer = "YES";
  // 회문 검사 시 대소문자 구분하지 않으므로 전부 소문자로 바꾼다.
  s = s.toLowerCase();
  const 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 = "chooHC";
console.log(solution(str));

방법2) 배열의 reverse 메소드 활용과 문자열 비교

function solution(s) {
  let answer = "YES";
  s = s.toLowerCase();
  // s.split('') => 문자열의 각 문자를 요소로 가지는 배열 반환
  // reverse() => 배열의 순서 반전: 첫 번째 요소는 마지막 요소, 마지막 요소는 첫 번째 요소가 된다.
  // join('') => 배열을 다시 문자열로 만들어준다.
  if (s.split('').reverse().join('') !== s) return "NO";
  return answer;
let str = "chooHC";
console.log(solution(str));

문제2.

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

예제1)

입력: found7, time: study; Yduts: emit, 9DnuOf
출력: YES

⛔ 주의사항 : 이번 문제의 입력에는 알파벳뿐만 아니라 숫자, 공백, 특수문자 등이 섞여 있음.

방법1) for 문을 이용한 문자열 접근 및 문자 비교

function solution(s) {
  let answer = "YES";
  
  // replace 메서드는 정규식의 규칙을 충족하는 문자열을 전부 공백으로 바꿔줌.
  s = s.toLowerCase().replace(/[^a-z]/g, "");
  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 = "found7, time: study; Yduts: emit, 9DnuOf";
console.log(solution(str));

방법2) 배열의 reverse 메소드 활용과 문자열 비교

function solution(s) {
  let answer = "YES";
  
  // replace 메서드는 정규식의 규칙을 충족하는 문자열을 전부 공백으로 바꿔줌.
  s = s.toLowerCase().replace(/[^a-z]/g, "");
  
  // s.split('') => 문자열의 각 문자를 요소로 가지는 배열 반환
  // reverse() => 배열의 순서 반전: 첫 번째 요소는 마지막 요소, 마지막 요소는 첫 번째 요소가 된다.
  // join('') => 배열을 다시 문자열로 만들어준다.
  if (s.split("").reverse().join("") !== s) return "NO";
  return answer;
}
let str = "found7, time: study; Yduts: emit, 9DnuOf";
console.log(solution(str));

위의 코드에서 오늘 새롭게 알게 된 사실이 있다.

💦 이전) 필자는 숫자, 공백, 특수문자 등이 포함된 문자열에 toLowerCase 메서드를 적용하여 문자열을 소문자로 변경할 경우 이상한 문자열 값이 나올 것이라고 생각했음.
💥 이후) 숫자, 공백, 특수문자 등이 포함된 문자열에 toLowerCase 메서드를 적용하면 알파벳 문자만 소문자로 변경시킴.

문제1 과 문제2 의 방법1, 방법2 에 따른 각각의 로직은 동일하다.
단 하나의 차이점은 입력값에 알파벳으로만 구성된 문자열인지 숫자, 특수문자, 공백이 섞인 문자열인지이다.

문제2 번을 풀 때,
숫자, 특수문자, 공백 등이 섞인 입력값이 나와 어떻게 가공해야 할 지 헤매고 있었는데 정규식과 string 의 replace 메서드를 활용하여 쉽게 해결할 수 있었다.

replace 메서드에 대한 사용법을 좀 더 알고 싶다면,
👀 다음 링크 참조
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace

profile
풀 스택 개발자를 지향하는 개발자 새내기입니다.

0개의 댓글