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 을 하는 방법은 여러가지가 있겠지만 실제 코테에서 나오게 된다면 검색이 불가능 하니 해당 방법을 철회하고 깡으로 풀게 되었다.
문제를 해결하고 두가지 참고하면 좋을 코드를 하단에 적어본다.
function solution(myStr) {
const list = myStr.split(/[a|b|c]/).filter(str => str);
return list.length ? list : ["EMPTY"];
}
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"]
}