본문 바로가기
알고리즘/Programmers

[TIL] 2023.08.14 Programmers_세 개의 구분자

by heereal 2023. 8. 15.

세 개의 구분자

문제 설명

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.

예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.

문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

 

 

입출력 예

myStr result
"baconlettucetomato" ["onlettu", "etom", "to"]
"abcd" ["d"]
"cabab" ["EMPTY"]

입출력 예 #1

  • 문제 설명의 예시와 같습니다.

입출력 예 #2

  • "c" 이전에는 "a", "b", "c" 이외의 문자가 없습니다.
  • "c" 이후에 문자열 "d"가 있으므로 "d"를 저장합니다.
  • 따라서 ["d"]를 return 합니다.

입출력 예 #3

  • "a", "b", "c" 이외의 문자가 존재하지 않습니다. 따라서 저장할 문자열이 없습니다.
  • 따라서 ["EMPTY"]를 return 합니다.

 

나의 풀이

function solution(myStr) {
    let arr = ["a", "b", "c"];
    for (const alpha of arr) {
        myStr = myStr.replaceAll(alpha, " ")
    }
    let answer = myStr.split(" ").filter((str) => str)
    return answer.length === 0 ? ["EMPTY"] : answer;
}

myStr에 존재하는 모든 a, b, c를 `replaceAll()` 메서드를 이용해서 공백으로 변환한다. 이 문자열을 공백으로 `split()`한 후에 공백인 요소는 필터링했다. 통과하긴 했지만 연산 시간도 오래 걸리고 비효율적인 구조의 풀이였던 거 같다.

 

 

다른 사람의 풀이

const solution=s=>s.match(/[^a-c]+/g)||['EMPTY']

정규표현식을 이용해서 a, b, c에 해당하지 않는 문자열을 `match()` 메서드로 배열 형태로 추출한다. `match()` 메서드는 일치하는 문자열이 없을 경우 null을 반환하는데, 이 점을 이용해서 주어진 문자열이 a, b, c로만 구성된 경우(match()의 결과가 null일 때)에는 OR 연산자의 속성으로 ['EMPTY'] 배열을 반환한다.

 


String.prototype.match()

str.match(regexp);

 

 

댓글