-
[프로그래머스 / JS] Lv.1 옹알이(2)Algorithm/프로그래머스 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 정도로 정규 표현식을 사용하는 게 실행 속도 측면에서 낫다.
사고과정
- babbling의 원소 하나하나 접근해서 평가하고 결과값을 생성할 필요가 있다. reduce를 사용하자
- babbling의 각 원소가 주어진 네 가지 발음으로만 구성되어있는지, 연속된 경우는 없는지를 판단해야한다.
- babbling의 원소 안에서 주어진 네 가지 발음이 존재할 경우 대응하는 한 문자로 변환하자(인덱스로 변환했다.)
- 변환 결과가 연속된 문자가 없는지, 변환되지 않은 경우는 없는지 판단해야한다.
- 변환 결과의 각 원소에 접근하며 현재값을 prev에 저장하고 다음 값을 평가할 때 연속된 문자인지 판단하기 위해 사용하자
- 변환 결과의 각 원소가 3에서 변환한 값들 중 존재하는지 여부에 따라 평가하자
- 성공!
- 그런데 정규 표현식을 사용하는 방법은 없을까?
- 주어진 각 옹알이가 연속되지 않아야 하므로 (?<!aya)(aya)(?!aya)와 | 를 사용하자
- 다시 성공!
정규 표현식의 패턴과 플래그에 대한 간단한 정리는 아래에서 확인 가능하다!!
평가
바닥에서부터 코드를 짜는 것도 좋지만 이왕이면 편하라고 만들어놓은 기능들 좀 쓰자!
개선점
알게된점
- 정규 표현식이 보다 심도있는 사용방법
반응형'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / JS] Lv.1 삼총사 (0) 2022.12.22 [프로그래머스 / JS] Lv.1 콜라 문제 (0) 2022.12.22 [프로그래머스 / JS] Lv.1 햄버거 만들기 (2) 2022.12.21 [프로그래머스 / JS] Lv.1 푸드 파이트 대회 (0) 2022.12.21 [프로그래머스 / JS] Lv.1 과일 장수 (0) 2022.12.21