codewars - filter(Boolean)과 정규표현식

정규표현식에 대해서

Posted by Yan on January 24, 2021

문제

Polycarpus works as a DJ in the best Berland nightclub, and he often uses dubstep music in his performance. Recently, he has decided to take a couple of old songs and make dubstep remixes from them.

Let’s assume that a song consists of some number of words (that don’t contain WUB). To make the dubstep remix of this song, Polycarpus inserts a certain number of words “WUB” before the first word of the song (the number may be zero), after the last word (the number may be zero), and between words (at least one between any pair of neighbouring words), and then the boy glues together all the words, including “WUB”, in one string and plays the song at the club.

For example, a song with words “I AM X” can transform into a dubstep remix as “WUBWUBIWUBAMWUBWUBX” and cannot transform into “WUBWUBIAMWUBX”.

Recently, Jonny has heard Polycarpus’s new dubstep track, but since he isn’t into modern music, he decided to find out what was the initial song that Polycarpus remixed. Help Jonny restore the original song.

  • Input The input consists of a single non-empty string, consisting only of uppercase English letters, the string’s length doesn’t exceed 200 characters

  • Output Return the words of the initial song that Polycarpus used to make a dubsteb remix. Separate the words with a space.

  • Examples

1
2
songDecoder("WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB");
// =>  WE ARE THE CHAMPIONS MY FRIEND


나의 풀이

1
2
3
function songDecoder(song){
  return const arr = song.split("WUB").filter(x => x !== "").join(" ")
}

다른 풀이들을 보니까 filter에는 Boolean을 넣을 수 있다

filter(Boolean)

  • Boolean은 하나의 선택적 매개변수를 취하는 네이티브 javascript 함수/생성자다.
    • Boolean(0) : false
    • Boolean(undefined) : false
    • Boolean({}) : true
    • Boolean(null) : false
    • Boolean(‘’) : false
    • Boolean(5) : true

위의 식에 filter(Boolean)을 넣으면 ““와 같이 빈 배열 인덱스가 false로 반환되어 나머지 index만 남게 된다.
그 결과 이렇게 간단하게 표현된다.

1
2
3
function songDecoder(song){
  return const arr = song.split("WUB").filter(Boolean).join(" ")
}


다른 풀이

1
2
3
function songDecoder(song) {
  return song.replace(/(WUB)+/g, " ").trim();
}

정규표현식

  • var re = /ab+c/;
    • 정규표현식 사용하기
  • 플래그 /g
    • 전역 검색
  • replace
    • 문자열.replace(정규식,대체문자)
    • 일치하는 문자열을 대체하고 대체된 문자열(String) 반환
  • +(WUB뒤의 +)
    • 1회 이상 연속으로 반복되는 문자에 가능한 많이 일치, {1,}와 동일
    • (WUB)+는 WUB가 포함된 문자, 그러니까 WUB, WUBWUB 모두 포함