[JS] 세 개의 구분자

Yongmin Park·2024년 6월 16일
0

JS-Programmers

목록 보기
10/14

프로그래머스 문제 링크

문제 풀이 생각 회로

a, b, c 라는 문자로 split 을 하여 나오는 문자열들을 리턴하면 되는 문제였다. 만약 myStr이 a, b, c 로만 이루어진 문자열이면 EMPTY를 리턴하면 되는 문제입니다.

고민했던 내용

하지만 split을 하면 리스트로 리턴되기 때문에 join을 해서 다시 문자열로 만들어 주어야하고 그 과정에서 예상하지 못한 문제가 발생했다.

그 문제는 바로 구분점이 사라진다는 것이다.

// 예를들어
"baconlettucetomato" 라는 문자열을 'a' 로 split을 하게 되면
['b', 'conlettucetom', 'to'] 가 리턴되게 된다. 이를 join 하면
'bonlettucetomto' 가 되는데 'b' 는 맨 앞 하나라 괜찮지만 'c'로 split 을 하게되면 
['onlettu', 'etomto'] 가 되게 된다.

우리가 원하는 결과값은 ["onlettu", "etom", "to"] 이것인데 말이다.

split 을 하는 방법은 여러가지가 있겠지만 실제 코테에서 나오게 된다면 검색이 불가능 하니 해당 방법을 철회하고 깡으로 풀게 되었다.

문제를 해결하고 두가지 참고하면 좋을 코드를 하단에 적어본다.

  1. split 안에 정규표현식을 넣을 수 있다. 이제라도 알아서 너무 다행이다.
function solution(myStr) {
    const list = myStr.split(/[a|b|c]/).filter(str => str);
    return list.length ? list : ["EMPTY"];
}
  1. 해당 방법은 생각하지 못했다. 똑똑한 사람은 많은 것 같다.
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
}

제출 코드

필자가 제출한 코드는 이렇다.

function solution(myStr) {
    let answer = []
    let [s, end] = [0, 0]
    for (let i = 0; i < myStr.length; i++) {
        if (myStr[i] !== 'a' && myStr[i] !== 'b' && myStr[i] !== 'c') {
            end++
        } else {
            if (s !== end) answer.push(myStr.slice(s, end))
            s = i + 1
            end = i + 1
        }
    }
    if (s !== end) answer.push(myStr.slice(s, end))
    return answer.length ? answer : ["EMPTY"]
}
profile
기록으로 기적을

0개의 댓글