Algorithm/프로그래머스

[프로그래머스 / JS] Lv.1 옹알이(2)

OnnJE 2022. 12. 22. 15:15
반응형

문제 설명

  머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 30
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

풀이

정규 표현식 사용 x)

function solution(babbling) {
    let possible = ["aya", "ye", "woo", "ma"];
    let nums = [...possible.keys()]

    let result = babbling.reduce((acc, cur) => {
        let prev = ''

        for (let idx = 0; idx < 4; idx++) {
            cur = cur.replaceAll(possible[idx], String(idx));
        }

        for (let ele of cur) {
            if (nums.includes(Number(ele)) && (prev != ele)) prev = ele
            else return acc
        }

        acc++
        return acc
    }, 0)

    return result
}

실행에 걸린 최대 시간 : 0.36ms

 

정규 표현식 사용)

function solution(babbling) {
    let regexp = /(?<!aya)(aya)(?!aya)|(?<!ye)(ye)(?!ye)|(?<!woo)(woo)(?!woo)|(?<!ma)(ma)(?!ma)/g
    
    let result = babbling.reduce((acc, cur) => {
        if (cur.replace(regexp, '') === '') acc++
        return acc
    }, 0)
                                 
    return result
}

실행에 걸린 최대 시간 : 0.33ms

 

*전체 평균값은 정규 표현식을 사용했을 경우가 약 0.2ms 아닌 경우가 0.3ms 정도로 정규 표현식을 사용하는 게 실행 속도 측면에서 낫다.

 

사고과정

  1. babbling의 원소 하나하나 접근해서 평가하고 결과값을 생성할 필요가 있다. reduce를 사용하자
  2. babbling의 각 원소가 주어진 네 가지 발음으로만 구성되어있는지, 연속된 경우는 없는지를 판단해야한다.
  3. babbling의 원소 안에서 주어진 네 가지 발음이 존재할 경우 대응하는 한 문자로 변환하자(인덱스로 변환했다.)
  4. 변환 결과가 연속된 문자가 없는지, 변환되지 않은 경우는 없는지 판단해야한다.
  5. 변환 결과의 각 원소에 접근하며 현재값을 prev에 저장하고 다음 값을 평가할 때 연속된 문자인지 판단하기 위해 사용하자
  6. 변환 결과의 각 원소가 3에서 변환한 값들 중 존재하는지 여부에 따라 평가하자
  7. 성공!
  8. 그런데 정규 표현식을 사용하는 방법은 없을까?
  9. 주어진 각 옹알이가 연속되지 않아야 하므로 (?<!aya)(aya)(?!aya)와 | 를 사용하자
  10. 다시 성공!

정규 표현식의 패턴과 플래그에 대한 간단한 정리는 아래에서 확인 가능하다!!

 

[JS] 정규 표현식의 패턴과 플래그

정규 표현식 기본 구성 /pattern/flags 정규 표현식은 위와 같이 구성된다. 두 슬래시 사이에 패턴이 위치하고 마지막으로 플래그가 위치한다. 정규 표현식은 아래 코드에서 확인 가능하듯이 두 가

ojhallae.tistory.com

 

평가

  바닥에서부터 코드를 짜는 것도 좋지만 이왕이면 편하라고 만들어놓은 기능들 좀 쓰자!

 

개선점

 

알게된점

  1. 정규 표현식이 보다 심도있는 사용방법
 

[JS] 정규 표현식의 패턴과 플래그

정규 표현식 기본 구성 /pattern/flags 정규 표현식은 위와 같이 구성된다. 두 슬래시 사이에 패턴이 위치하고 마지막으로 플래그가 위치한다. 정규 표현식은 아래 코드에서 확인 가능하듯이 두 가

ojhallae.tistory.com

 

 

 

반응형