자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.
📋 문제
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 한다.
문자열이 입력으로 들어왔을 때 해당 문자열이 회문 문자열이라면 "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는 회문 문자열이 아니다.
회문 문자열의 개념을 그대로 코드에 반영한 모습이다.
'Algorithm > JavaScript' 카테고리의 다른 글
[문자열탐색] 숫자만 추출 (0) | 2021.12.10 |
---|---|
[문자열탐색] 유효한 팰린드롬 (0) | 2021.12.10 |
[배열탐색] 봉우리 (0) | 2021.12.09 |
[배열탐색] 격자판 최대합 (0) | 2021.12.09 |
[배열탐색] 등수 구하기 (0) | 2021.12.09 |
댓글