[프로그래머스] 옹알이(2) Javascript (lv1)

Taemin Jang·2023년 1월 16일
0

코딩테스트

목록 보기
3/9
post-thumbnail

문제 출처

[프로그래머스] 옹알이(2)

문제 설명

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


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

입출력 예
babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2

유의사항
  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

나의 풀이

function solution(babbling) {
  	// 발음이 포함되어 있는 것들만 다시 배열로 만들었다.
  	// ex)	[ [ 'aya', 'ye' ], [ 'ye', 'ye' ], [ 'ye', 'ma', 'woo' ] ]
    let newBabbling = babbling.map(v => {
        let arr =[...v.matchAll(/aya|ye|ma|woo/g)];
        return arr.flat();
    }).filter((v,i) => v.join("") === babbling[i]);
    let cnt =  0;
  	
    newBabbling.forEach((v,i) => {
        let index = 0;
        while(index < v.length){
          	// 만약 연속된 글자가 있다면 반복문을 멈춘다.
            if(v[index] === v[index+1]) break;
            index++;
        }
        if(index === v.length){
            cnt++;
        }
    })
    return cnt;
}

첫 번째, 정규식을 활용해 발음이 포함되어 있는지 확인하기.

나는 matchAll() 메서드를 활용해서 풀었다.
간단하게 matchAll() 메서드는 정규식이 포함되어 있는 문자들을 배열로 반환시켜준다.

예를 들어, "ayaayaa"라는 문자열이 있는데 matchAll()을 사용하면 해당 정규식에 부합하는 문자들을 배열로 반환한다.
[..."ayaayaa".matchAll(/aya|ye|ma|woo/g)]을 하게 되면 [["aya","aya"]]로 출력한다.

여기서 스프레드 연선자를 사용했는데 Object로 반환하기 때문에 [...]를 사용해서 배열로 만들어주었다.
그렇게 되면 [["aya", "aya"]] 이렇게 배열이 중첩되어버린다.

그래서 나는 flat() 메서드를 사용해 중첩을 1차원 배열로 ["aya", "aya"] 평탄화 시켜주었다.

두 번째, 발음만 포함되어 있는 문자열을 가져오기.

위에서 본 예제로 보면 "ayaayaa"는 발음이 안되는 문자가 들어가 있다.
첫 번째에서 나온 배열을 보면 ["aya", "aya"] 발음만 포함되어 있다. 그래서 이 배열을 join()으로 문자열을 만들어주고 원래 문자열과 비교해서 맞는 것들만 filter()로 통과된 배열을 newBabbling 배열로 반환해주었다..

"ayayeaya", "yeye" 같은 경우는 우선 발음이 가능한 문자만 들어가 있기 때문에 통과가 된다.

세 번째, 발음이 연속되는지 확인하기.

그렇게 새로 반환된 배열 newBabbling을 보면
[ [ 'aya', 'ye' ], [ 'ye', 'ye' ], [ 'ye', 'ma', 'woo' ] ]로 되어 있다.
그래서 forEach문을 사용해 1차 배열을 벗겨주었다.

let index = 0변수를 선언해주었는데 발음이 연속되는지 확인하기 위해서 선언해주었다.
while문으로 첫번째 단어와 두번째 단어가 같으면 반복문을 멈춘다.
만약 같지 않다면 index를 1씩 더해주는데, 반복문이 끝나고 index와 v.length의 길이가 같으면 연속되지 않은 것이다.

그 이유는 중간에 연속된 단어가 있었다면 break로 인해 더이상 반복문이 돌지 않고 나오기 때문이다.

마무리

정규식을 활용하는 문제는 항상 어려운 것 같다.

다른 분들의 풀이를 보니까 정규식을 잘 사용해서 쉽게 푸신 분들도 많았다.
이렇게 비슷하게 접근을 해도 어떻게 사용하냐에 따라 쉽게, 어렵게 푸는 것 같다.

다음은 정규식을 한 번 정리해봐야겠다.

profile
하루하루 공부한 내용 기록하기

0개의 댓글