[프로그래머스-기초] 세 개의 구분자

JE·2024년 1월 20일
0

코테/코플릿

목록 보기
55/57

세 개의 구분자

문제 설명

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

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

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

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

제한사항

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

입출력 예

myStrresult
"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 = [...myStr].map(el => el !== 'a' && el !== 'b' && el !== 'c' ? el : '1')
    let filterArr = arr.join('').split('1').filter((el) => el.length > 0)

    return filterArr.length > 0 ? filterArr : ['EMPTY']
}

이번 문제는 약간 무지성으로 문제를 푼 것 같다.

map으로 순환해 특정 문자열이 포함되어 있지 않다면 요소 그대로를 아니라면 '1'로 교체한
배열을 반환했다.

반환한 배열을 arr에 저장하고 join('').split('1')
'1'기준으로 쪼개 다시 배열로 만들었다.

이를 filter를 통해 요소의 길이가 0 이상인 것만 반환했고
마지막으로 fillterArr의 길이가 0보다 크다면 그대로를 반환하고
아니라면 ['EMPTY']를 반환했다.

이번 문제는 split와 정규식 표현을 알고 있어야 문제를 수월하게 풀 수 있었던거 같다.

정규표현식 작성 방법을 확인하고 다시 풀어 보았다.

리팩토링 하기

function solution(myStr) {
    let arr = myStr.split(/[a|b|c]/).filter((el) => el.length > 0);
    return arr.length > 0 ? arr : ['EMPTY']
}

/[a|b|c]/ 특정 문자열을 기준으로 문자열을 잘라준 배열을
filter를 통해 원하는 배열 요소만 추출한다.

마지막으로 arr의 길이가 0 이상이면 그대로, 아니라면 ['EMPTY']을 반환한다.

이전 내가 작성한 코드와 비교 했을 때 불필요한 행동을 줄일 수 있었다.
이번 문제를 통해 정규식 표현을 제대로 알고 가는 것 같다.

이분이 정규표현식에 대해 정리를 잘해 주신 것 같다.
[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코드) - [카레유:티스토리]

다른 사람이 작성한 코드

const solution=s=>s.match(/[^a-c]+/g)||['EMPTY']
function solution(myStr) {
    const arr = myStr.split(/[abc]/).filter(e => e);
    return arr.length == 0 ? ["EMPTY"] : arr;
}
function solution(myStr) {
    const regex = /a|b|c/g
    const test = myStr.replaceAll(regex, ' ').split(' ').filter((v)=>v)
    return test.length !== 0 ? test : ["EMPTY"]
}

다들 정규표현식을 활용하셨는데 작성한 방식이 달라서 3개의 예시문을 가져와 봤다.


이번 문제를 통해 너무 무지성으로 문제를 푼 것 같다..
하루에 3개는 과부화가 오는 것 같다.
2개 정도가 적당한 것 같다.

다음에 비슷한 문제가 나온다면 그 땐 정규표현식을 이용해 문제를 해결해 나가야겠다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글