[js] 세 개의 구분자

sookyoung.k·2024년 6월 26일
1
post-thumbnail

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

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

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

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

제한사항

  • 1 ≤ myStr의 길이 ≤ 1,000,000
    • myStr은 알파벳 소문자로 이루어진 문자열 입니다.

나의 풀이

function solution(myStr) {
    let result = [...myStr]
            .map(v => v === "a" || v === "b" || v === "c" ? ' ' : v)
            .join('').split(' ')
            .filter(v => v);
    return result.length > 0 ? result : ["EMPTY"];
}
  1. 문자열을 배열로 쪼갠다.
  2. map() 메서드를 사용해서 배열의 요소를 순회한다. 만일 해당 요소가 문자 a나 b나 c에 해당할 경우 ' ' 공백으로 바꿔버린다.
  3. 새로 반환된 배열을 문자열로 합친 후 공백을 기준으로 쪼갠다. (split() 메서드 사용)
  4. 쪼개진 배열에서 공백을 제외하여 다시 새로운 배열을 만든다.
  5. 최종적으로 만들어진 result 배열이 0보다 크면 result를 반환하고, 그렇지 않을 경우 ["EMPTY"]를 반환한다.

다른 풀이 1

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

... 정규표현식으로 이렇게 간단히...?

  1. 정규표현식으로 패턴에 맞는 부분 문자열을 배열로 반환한다.
    • [^a-c]: a, b, c를 제외한 모든 문자에 매칭
    • +: 하나 이상의 연속된 문자 매칭
    • g: 전역 검색 플래그로 문자열 전체에서 패턴을 찾는다.
  2. 만약 결과가 null일 경우 ["EMPTY"]를 반환한다.

다른 풀이 2

function solution(myStr) {
    const list = myStr.split(/[a|b|c]/).filter(str => str);
    return list.length ? list : ["EMPTY"];
}
  1. 정규표현식을 사용하여 문자열을 a, b, c로 분리한다.
  2. filter() 메서드로 빈 문자열을 걸러낸다.
  3. 반환은 똑같음

다른 풀이 3

function solution(myStr) {
    const tmp1 = myStr.split("a").join("b")
    const tmp2 = tmp1.split("b").join("c")
    const tmp3 = tmp2.split("c").filter(x => x)
    if (tmp3.length === 0) return ["EMPTY"]
    return tmp3
}
  1. 문자열을 a로 분리한 배열을 b로 합친다.
  2. b로 분리한 배열을 c로 합친다.
  3. c로 분리한 배열을 filter() 메서드로 빈 문자열을 제거해준다.
  4. 최종 tmp3 배열의 크기가 0일 경우 ["EMPTY"] 반환
  5. 아니라면 그대로 반환
profile
영차영차 😎

0개의 댓글