JS algorithms - 옹알이 (1) 과 정규표현식

Jaa-van·2023년 4월 12일
0
post-thumbnail

문제

@옹알이(1)
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

정규표현식을 사용하는 것이 가장 편할 것 같아 보이기 때문에 정규표현식을 공부하는 시간을 갖기로 했다

시도

정규 표현식을 사용하지 않고 중첩 for 문을 돌리는 방법도 있지만

function solution(babbling) {
    let count = 0;
    const possible = ["aya", "ye", "woo", "ma"];

    for(let b of babbling) {
        for(const p of possible) {
             b = b.replace(p, "_")
            console.log(b);
            if((b.includes("_") && b.length == 1) || (b.includes("__") && b.length == 2) || (b.includes("___") && b.length == 3) || (b.includes("____") && b.length == 4)) {
                console.log("실행")
                count++;
                break;
            }
        }
    }
    return count;
}

이처럼 복잡한 코드가 나오게 된다

@정규표현식 메서드

  • ('문자열').match (/정규표현식/ 플래그 )
    '문자열'에서 '정규표현식' 에 매칭되는 항목을 ~배열~로 반환한다
    -> 반환값이 배열이라는 것을 주의하자

  • ('문자열').replace (/정규표현식/ , "대체문자열" )
    '문자열'에서 '정규표현식'에 매칭되는 항목을 '대체문자열' 로 변환해준다

  • ('문자열').split (/정규표현식/ )
    '문자열'을 '정규표현식'을 기준으로 쪼개어 배열로 반환한다

  • (정규표현식).text('문자열')
    '문자열'과 '정규표현식'이 매칭되면 true, 아니면 false 를 반환한다
    -> 반환값이 boolean

  • (정규표현식).exec('문자열')
    match 와 비슷한 역할을 하지만 첫번째 매칭 결과만 반환한다

@정규표현식 플래그

  • i -> 대소문자를 구분하지 않고 검색한다

  • g -> 문자열 내의 모든 패턴을 검색한다
    /g 가 없으면 최초 검색결과 한번을 반환하지만 있으면 모든 검색 결과를 배열로 반환해준다

  • m -> 행이 바뀌더라도 계속 검색한다

  • s -> .(모든 문자 정규식) 이 개행 문자 \n에도 포함하도록 한다

  • u -> 유니코드 전체를 지원한다

  • y -> 문자 내 특정 위치에서 검색을 진행하는 "sticky"모드를 활성화한다

@정규식 특정 문자 숫자 매칭 패턴

  • a-zA-Z 영어알파벳(-으로 범위 지정)

  • ㄱ-ㅎ가-힣 한글 문자(-으로 범위 지정)

  • 0-9 숫자(-으로 범위 지정)

  • . 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두)
    % 단, 줄바꿈 X

  • \d 숫자

  • \D 숫자가 아닌 것

  • \w 밑줄 문자를 포함한 영숫자 문자에 대응
    % [A-Za-z0-9_] 와 동일

  • \W \w 가 아닌 것

  • \s space 공백

  • \S space 공백이 아닌 것

  • \특수기호 특수기호 * \^ \& ! \? ...등

@정규식 검색 기준 패턴

  • | -> OR

  • [] -> 괄호안의 문자들 중 하나. or 처리 묶음 보면 된다.

  • /abc/ -> "abc" 전체를 검색한다

  • /[abc]/ -> "a" 또는 "b" 또는 "c" 를 검색한다

  • [다-바] -> 다 or 라 or 마 or 바

  • [^문자] -> 괄호안의 문자를 제외한 것

  • [^lgEn] - > "l" "g" "E" "N" 4개 문자를 제외
    % 대괄호 안에서 쓰면 제외의 뜻, 대괄호 밖에서 쓰면 시작점 뜻

  • ^문자열 -> 특정 문자열로 시작 (시작점)
    /^www/

  • 문자열$ -> 특정 문자열로 끝남 (종착점)
    /com$/

정규표현식에 대한 문법이 이보다 더 많지만 알고리즘을 푸는 것에 있어 최소한 알아야 하는 수준인 것 같다

https://regexr.com/5ml92

사이트에서 정규 표현식을 연습해볼 수 있다

해결

function solution(babbling) {
    let filtered = babbling.map(e=>e.match(/aya|ye|woo|ma/g))
    let result = 0
    for (let i =0;i<babbling.length;i++) {
        if (filtered[i]==null) {}
        else if (filtered[i].join('') == babbling[i] ) result++
    }
    return result
}

babbling 배열을 map 메서드를 이용해서 각 요소에 정규 표현식을 매치시켜서 나누어 주고
그 배열을 join 하여 기존의 배열과 비교하여서
같을 경우에 발음할 수 있다고 판단 후 result 에 가능한 요소들을 세어주는 방식으로 해결하였다

결론

정규표현식이 복잡해 보이지만 js 에서는 특히 특정 상황에서 유용하다

0개의 댓글

관련 채용 정보