본문 바로가기
개발 지식 B+/코딩 테스트

프로그래머스 | 옹알이 - 재귀로 풀기

by ddubbu 2022. 10. 31.
728x90
반응형
function solution(babbling, available =["aya", "ye", "woo", "ma"]) { 
    // 재귀 return 값은, babbling이 가질 수 있는 정답의 수
    
    let tempAnswer = 0;
    
    babbling.forEach(item=>{
        for(let i=0; i<available.length; i++){
            const split = item.split(available[i]).filter(temp=> Boolean(temp));
            
            if(split.join('').length < item.length - available[i].length) break;
            // 유의사항 1. 
			// 같은 단어는 한번씩만 존재한다. 즉, 연속된 단어의 경우 split 해버리면 안됨.
			// 몇 개 들었는지 알 수 없음.
            
            if(split.length === 0) {
                tempAnswer += 1; // item 분석 끝났으니 nextItem 으로 넘기기
                break;
            } else if(split.length === 1 && split[0] === item){ // 그대로이면, available[i++] 으로 넘기기
                continue;
            } else {
                const newAvailable = available.slice(1);
                const result = solution(split, newAvailable); 
                if(result === 0) continue;
                else {
                    if (result === split.length) { 
                    	// 유의사항 2. 다른 재귀 문제와 달리 단어 한개가 쪼개졌으므로, result 를 다르게 해석해야함.
                        tempAnswer += 1;
                    }
                    break; 
                    }
                }
        }
    })
    
    return tempAnswer;
}


입문 문제 풀다가 화딱지 났다. 하지만 오랜만에 한문제 풀어서 매-우 뿌듯하다.

다음 목표
1. 타인 풀이 보면서 더 간단한 방법 공부해보자.
2. 첫 아이디어였던, item.replace(available[i], '') 의 경우 새로운 단어가 생성될까봐 포기했는데, 다른 구분자를 넣어 많이들 간단하게 푸셨더라. 방법2로 추가 정리해보자.

반응형

'개발 지식 B+ > 코딩 테스트' 카테고리의 다른 글

프로그래머스 level2 배지 획득!  (0) 2021.01.10
순열 - 재귀로 구현  (0) 2020.12.12