세 개의 구분자
문제 설명
임의의 문자열이 주어졌을 때 문자 "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);
- match() 메서드는 문자열이 정규식과 매치되는 부분을 검색합니다.
- 결과 값: 문자열이 정규식과 일치하면, 일치하는 전체 문자열을 첫 번째 요소로 포함하는 Array를 반환한 다음 괄호 안에 캡처된 결과가 옵니다. 일치하는 것이 없으면 null이 반환됩니다.
- 출처 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/match
'알고리즘 > Programmers' 카테고리의 다른 글
[TIL] 2023.08.16 Programmers_숨어있는 숫자의 덧셈 (2) (0) | 2023.08.16 |
---|---|
[TIL] 2023.08.15 Programmers_문자열 묶기 (0) | 2023.08.15 |
[TIL] 2023.08.13 Programmers_빈 배열에 추가, 삭제하기 (0) | 2023.08.13 |
[TIL] 2023.08.11 Programmers_날짜 비교하기 (0) | 2023.08.11 |
[TIL] 2023.08.03 Programmers_0 떼기 (0) | 2023.08.03 |
댓글