Algorithm/JavaScript

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

_sweep 2021. 12. 9. 17:28

자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.

 

 

 

 

📋 문제

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 한다.

문자열이 입력으로 들어왔을 때 해당 문자열이 회문 문자열이라면 "YES"를, 아니면 "NO"를 출력한다.

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

 

 

👉 입력

길이 100을 넘지 않고 공백이 없는 문자열이 입력된다.

 

 

👈 출력

회문 문자열인지의 결과를 "YES" 또는 "NO"로 출력한다.

 

 

💡 사용된 개념

String.split()

String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다. 반환값은 구분자마다 끊은 부분 문자열을 담은 배열이다.

str.split([separator[, limit]])
  • separator : 원본 문자열을 끊어야 할 부분을 나타내는 문자열이다. 빈 문자열일 경우 str의 각 문자가 배열의 원소 하나씩으로 변환된다.
  • limit : 끊어진 문자열의 최대 개수를 나타내는 정수이다. 이 매개변수가 주어지면 끊어진 배열의 원소가 limit개가 되면 멈춘다.

 

Array.reverse()

배열의 순서를 반전한다. 첫 번째 요소는 마지막 요소가 되며 마지막 요소는 첫 번째 요소가 된다.

 

Array.join()

배열의 모든 요소를 연결해 하나의 문자열로 만든다.

arr.join([separator])
  • separator : 배열의 각 요소를 구분할 문자열을 지정한다. 생략시 쉼표로 구분된다. 빈 문자열일 경우 모든 요소들이 공백없이 연결된다.

 

 

📝 풀이

 

function solution(s) {
    let answer = "YES";
    s = s.toLowerCase();

    for (let i = 0; i < Math.floor(s.length / 2); i++) {
        if (s[i] !== s[s.length - i - 1]) answer = "NO";
    }

    return answer;
}

let str = "goooooG";
console.log(solution(str));

 

answer의 값을 "YES"로 초기화한다.

회문 문자열 비교 시 대소문자는 구분하지 않기 때문에 주어진 문자열 s의 모든 문자를 toLowerCase()를 이용해 소문자로 치환한다.

for문으로 s의 요소를 순회한다. 이때 끝까지 순회할 필요는 없기 때문에 s의 길이의 절반이 되는 지점까지만 순회한다.

s의 맨 앞과 맨 뒤, 앞에서 첫 번째와 뒤에서 첫 번째 ... 를 비교한다.

이때 일치하지 않는 것이 있다면 회문 문자열이 아니므로 answer의 값을 "NO"로 변경한다.

 

다른 방법으로는 아예 문자열을 통째로 비교하는 방법도 있다.

 

function solution(s) {
    let answer = "YES";
    s = s.toLowerCase();
    if (s.split('').reverse().join('') != s) answer = "NO"

    return answer;
}

let str = "goooooG";
console.log(solution(str));

 

s의 모든 문자를 소문자로 치환하는 것은 앞선 방식과 동일하다.

이후 split()을 사용해 s의 각 문자를 하나씩 나누어 배열으로 반환한 후 이를 reverse()로 반전시키고 다시 join()으로 문자열을 만든다.

이 과정을 거치면 입력받은 문자열 s를 그대로 반전시킨 문자열이 만들어진다.

따라서 이를 비교해 같은 문자열이라면 s는 회문 문자열이고 다른 문자열이라면 s는 회문 문자열이 아니다.

 

회문 문자열의 개념을 그대로 코드에 반영한 모습이다.