[문자열탐색] 회문 문자열
자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.
📋 문제
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 한다.
문자열이 입력으로 들어왔을 때 해당 문자열이 회문 문자열이라면 "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는 회문 문자열이 아니다.
회문 문자열의 개념을 그대로 코드에 반영한 모습이다.