
모음을 제거하는 문제를 풀다 코드가 깔끔해 보이지 않아 '어떻게 하면 더 간결하게 코드를 바꿀 수 있을까?' 하는 의문을 시작으로 다른 코드를 살펴보게 되었다.
// 처음 작성한 코드
function solution(my_string) {
var answer = '';
for(let i = 0; i < my_string.length ; i++){
if(my_string[i] !== 'a' &&
my_string[i] !== 'e' &&
my_string[i] !== 'i' &&
my_string[i] !== 'o' &&
my_string[i] !== 'u'){
answer += my_string[i];
}
}
return answer;
}
작성한 코드는 주어진 문장이 있으면 solution 함수에 넣어 for문을 통해 문장을 처음부터 끝까지 돌면서 모음이 있지 않는 경우에 answer이라는 변수에 값을 넣는 식으로 풀어보았다.
문제는 모음만 제거하면 되는데 다른 제거 방법은 없을까하다 알게 된 것이 replace()이다. 그 중 정규표현식을 사용한 방법이다.
function solution(my_string) {
return my_string.replace(/[aeiou]/ig, "");
}
replace()는 어떤 패턴에 일치하는 일부 또는 모든 부분을 입력한 값으로 바꾸어 새로운 문자열을 반환하는 함수이다. 문자열 혹은 정규표현식을 사용할 수 있는데 이 문제에서는 a,e,i,o,u 총 5개의 단어를 사용해야 하기에 정규표현식으로 입력하였다. 입력한 값은 " "와 같은 공백이 아닌 "" 빈 값으로 변환하도록 하였다.
그래서 replace에 대해 더 알아보기 위해 다른 문제도 풀어보았다.
특수 문자 제거 - 프로그래머스
이 문제 또한 문자를 제거하면 되기에 replace()를 사용했다. 하지만 문제가 있는지 테스트를 통과하지 못했다.
//오류가 발생한 코드
function solution(my_string, letter) {
return my_string.replace(letter, "");
}
그 이유는 입출력 예시를 보면 다음과 같다.
my_string letter result
"abcdef" "f" "abcde"
"BCBdbe" "B" "Cdbe"
첫번째 "abcdef"에서 "f"는 제거되었지만 두번째 "BCBdbe"에서는 맨 처음에 나온 "B"만 제거되어 결과가 CBdbe"가 나왔다. 어떻게하면 모든 B를 지울 수 있을까 찾아보다 replaceAll() 함수를 알게 되었다. replaceAll()은 하나가 아닌 선택한 모든 값을 변환할 수 있다.
function solution(my_string, letter) {
return my_string.replaceAll(letter, "");
}
두 문제를 가지고 알 수 있는 사실은 다음과 같다.
1. replace()는 특수 문자 제거 문제처럼 첫 번째 문자열만 치환되어 1개만 변환된다.
2. 모음 제거 문제와 같이 정규표현식을 쓴 경우에는 모든 문자를 바꿀 수 있다.
3. 정규표현식을 쓰지 않고 모든 문자를 바꾸기 위해서는 replaceAll()을 사용하면 된다.