코딩연습

(JavaScript) 옹알이(2)

Realuda72 2024. 12. 9. 11:32

옹알이(2) (https://school.programmers.co.kr/learn/courses/30/lessons/133499)

 

문제 해결 방법

1. babbling을 순회하며 몇개의 단어를 발음할 수 있는지 센다.

var answer = 0;
for(e of babbling){
    if(...){
        answer++;
    }
}
return answer;

 

2. 단어가 발음 가능한 단어인지 확인한다.

2-1. 단어가 발음 가능한 단어로 시작하는지 확인한다.

2-2. 발음 가능한 단어가 직전에 발음한 단어와 같다면 false를 반환한다.

2-3. 발음 가능한 단어로 시작한다면, 단어의 앞부분에서 발음 가능한 단어를 제거한다.

2-4. 발음 가능한 단어로 시작하지 않는다면, false를 반환한다.

2-5. 단어에 문자가 남지 않았다면 true를 반환한다.

 

무작정 작성한 코드

function foo(babble){
    const word = ["aya", "ye", "woo", "ma"];
    
    var lastbab = ''; // 마지막으로 나온 단어를 저장한다.
    while(true){
        var found = false; // 발음 가능한 단어로 시작하는지 확인하는 변수 found
        for(e of word){ // 단어가 발음 가능한 단어로 시작하는지 확인한다.
            if(babble.startsWith(e)){
                if(e === lastbab) return false; // 단어가 발음 가능하고 반복하지 않는지 확인한다.
                babble = babble.substr(e.length); // 단어 앞부분을 자른다.
                found = true;
                lastbab = e;
                break;
            }
        }
        if(!found) return false; // 단어가 발음 가능하지 않다면 false를 반환한다.
        if(babble.length === 0) return true; // 더 이상 단어가 남지 않았으면 true를 반환한다.
    }
}

 

 for문 안에서 여러 조건 중 하나라도 만족하는 경우를 찾는 것은 어렵다.

 for문을 탈출 했을 때, 이게 조건을 찾아서 중간에 탈출한건지, 아니면 찾지 못하고 for문을 모두 돌아서 탈출한건지 확인해줄 변수가 하나 필요하다.

 이런 변수의 사용을 없애기 위해 다른 검사 구조를 생각해보자면, 조건을 비교하는 부분을 함수로 빼는 것이다.

for(e of arr){
    if(...) return true;
}
return false;

 이렇게 하면 눈엣가시인 found 변수를 없앨 수 있고, 코드 흐름도 보기 좋아진다.

function foo(babble){    
    var lastbab = ''; // 마지막으로 나온 단어를 저장한다.
    while(true){
    	var e = bar(babble); // 단어가 발음 가능한지 확인하는 함수. 이번에 발음한 단어를 반환한다.
        if(e){
            if(e === lastbab) return false; // 단어가 반복하는지 확인한다.
            babble = babble.substr(e.length); // 단어 앞부분을 자른다.
            lastbab = e;
        }else return false;
        if(babble.length === 0) return true; // 더 이상 단어가 남지 않았으면 true를 반환한다.
    }
}

function bar(babble){
    const word = ["aya", "ye", "woo", "ma"];

    for(e of word){
    	if(babble.startsWith(e)) return e;
    }
    return null;
}

 다만 동일한 단어를 반복해서 발음할 수 없다는 조건 때문에, bar함수에서 이번에 발음한 단어를 반환해야 하는 불편함이 있다.

 

 최종 코드

function solution(babbling) {
    var answer = 0;
    
    for(e of babbling){
        if(foo(e)){
            answer++;
        }
    }
    return answer;
}

function foo(babble){    
    var lastbab = '';
    while(true){
    	var e = bar(babble);
        if(e){
            if(e === lastbab) return false;
            babble = babble.substr(e.length);
            lastbab = e;
        }else return false;
        if(babble.length === 0) return true;
    }
}

function bar(babble){
    const word = ["aya", "ye", "woo", "ma"];

    for(e of word){
    	if(babble.startsWith(e)) return e;
    }
    return null;
}

 solution을 제외하고도 함수를 두개나 만들어버렸다. 그래도 found같은 어거지 변수를 쓰는것보다는 깔끔한 것 같다.

'코딩연습' 카테고리의 다른 글

(JavaScript) 햄버거 만들기  (0) 2024.12.13
(JavaScript) 대충 만든 자판  (0) 2024.12.11
(JavaScript) 문자열 나누기  (0) 2024.12.10
(JavaScript) 체육복  (0) 2024.12.10
(JavaScript) 숫자 짝꿍  (0) 2024.12.09