본문 바로가기
코딩 문제/프로그래머스 [ JavaScript ]

[ 프로그래머스 / JavaScript ] 옹알이

by CODESIGN 2022. 10. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/120956?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

 

제한사항

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

 

입출력 예

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

 

입출력 예 설명

입출력 예 #1

  • ["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

 

입출력 예 #2

  • ["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yewoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return 합니다.

 

유의사항

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

나의 풀이

Lv.0이라 쉬운 마음으로 시작했는데 생각보다 푸는데 오랜 시간이 걸렸다.

Test case 중 1번이 통과가 안되서였다. 1번의 test case는 예를 들어 babbling이 "ayayewoomawooma" 일 때 1을 리턴해야 한다. 

말할 수 있는 단어가 연속으로 붙어있지 않지만 사용했던 단어를 또 사용한 예제이다. 

 

나의 문제점은 단어를 한 번씩만 확인을 해서 마지막에 "wooma"가 남아 0을 리턴했다.

이 문제를 해결하기 위해서 while loop을 사용하여 현재 babbling 단어의 길이가 0일 될 때까지 확인을 하게 하면서 

babbling 단어의 길이가 0일 될 때 answer에 +1을 해주었다.

 

자세한 설명은 코드의 주석에 참고.

 

function solution(babbling) {
    var answer = 0;
    var words = ["aya", "ye", "woo", "ma"];
    for (let i = 0; i < babbling.length; i++) {
	    let keepCheck ='';
	    while(babbling[i]!="") { 
	        let find = false;
           	for (let j = 0; j < 4; j++) {
                	let existIndex = babbling[i].search(words[j]); // 매칭되는 단어의 index return        
                	if (existIndex == 0 && words[j] != keepCheck) { //매칭되는 단어가 첫글자이고 전단어와 같지 않을때
			       	let removeMatch = babbling[i].replace(words[j], ""); // 말한단어는 없애준다
                    		babbling[i] = removeMatch;
			        keepCheck = words[j]; //현재단어를 저장한다. 단어의 남은 부분이 같은 단어를 연속으로 말하는지 체크하기 위함
			        find = true;
                 	}
	        }
	        if (babbling[i]==""){ answer+=1; break;} 
            	if (find == false){break;}        
		} 
	}
    return answer;
}

 

 


다른 풀이

 

정규표현식을 활용하여 문제를 풀었다.  코드는 훨씬 간결하지만 효율적인 면에서는 떨어진다.

그래도 정규표현식을 잘 활용한 코드라 리뷰해보았다.

모든 가능한 단어에서 연속으로 반복된 단어에는 '어려워ㅎ'로 단어를 바꾸고

모든 가능한 단어에서 발음이 가능한 단어들은 모두 ''로 바꾸어주고

마지막에 배열중에 ''인 아이들만 가져와 그 길이(고로 말할 수 있는 단어)를 반환하였다.

 

function solution(babbling) {
    const 가능한_발음_목록 = ["aya", "ye", "woo", "ma"]
    return babbling.filter((e) => {
        가능한_발음_목록.forEach((가능한_발음) => {
            e = e.replace(new RegExp(가능한_발음 + 가능한_발음, 'gi'), '어려웡ㅎ')
            e = e.replace(new RegExp(가능한_발음, 'gi'), '')
        })
        return e === ''
    }).length;
}

 

댓글