3 minute read




문제 풀이


이 문제는 주어진 옹알이 단어중에서 “aya”, “ye”, “woo”, “ma” 4가지 조합의 발음만을 하는지를 검증해야 한다.
위의 4가지 발음이 연속으로 조합된다거나, 단어 사이에 조합된다면 올바른 발음이 되지 않음을 유의해야 한다.


최초 아이디어 도출

  • 옹알이 단어 배열을 두어, 주어진 발음에서 옹알이 단어가 나오는지 확인한다.
    • 또한, 연속으로 옹알이 단어가 나오는지 확인하기 위해 연속 옹알이 조합 배열도 별도로 생성한다.
  • 주어진 발음 단어를 순회하며 연속된 옹알이인지 확인한다.
    • 연속된 옹알이는 올바른 옹알이가 아니기 때문에 카운트하지 않는다.
  • 주어진 발음 단어를 순회하며 올바른 옹알이인지 확인한다.
    • 주어진 발음 단어의 조합이 올바른 옹알이들로 이루어져있다면 ““로 만든다.
  • 주어진 발음단어가 ““이라면 발음 가능한 옹알이로 조합되어 있다고 판단하고 카운트한다.


말로써 설명하면 좀 복잡한데, 중요한 핵심은 연속된 옹알이와 올바른 옹알이를 잘 구분하면 된다는 것이다. 코드를 작성해보자.

1
2
3
String[] realBabbling = {"aya", "ye", "woo", "ma"};
String[] dupBabbling = {"ayaaya", "yeye", "woowoo", "mama"};
int possiableBabCnt = 0;

작성한 아이디어대로 올바른 옹알이와 연속된 옹알이를 구분하기 위해 각각 별도의 배열로 만들어두자.
그리고 최종적으로 발음 가능한 옹알이 단어의 갯수를 반환하기 위한 possiableBabCnt 변수를 초기화한다.

1
2
3
4
5
6
7
8
9
10
for(String bab : babbling) {  
    for(String dbab : dupBabbling) {
        bab = bab.replace(dbab, "*");
    }
    for(String rbab : realBabbling) {
        bab = bab.replace(rbab, "");
    }

    if(bab.equals("")) possiableBabCnt++;
}

String의 replace()를 활용하여 주어진 발음 단어에 연속된 옹알이가 존재한다면 연속된 옹알이 부분을 “*“로 치환한다.
그리고 올바른 옹알이는 ““로 치환하면 연속된 옹알이인지, 올바른 옹알이인지 구분할 수 있다.
주어진 발음 단어가 올바른 옹알이로 구성되었다면 ““의 문자열 값을 가지기 때문에 해당 값이 ““라면 카운트를 세면 된다.

그런데, 이대로 코드를 작성하고 테스트해보니 문제가 발생하였다.

발음 불가능한 옹알이 단어가 존재한다고?

예를 들어 “mwooa” 라는 발음 단어를 살펴보면, 위의 코드대로라면 “woo”라는 옹알이가 발음단어에 존재하기에 ““로 치환되어 “ma”가 될테고,
“ma”도 옹알이로 인정받는 발음이기에 동일하게 ““로 치환된다. 결국 “mwooa”는 정상적인 옹알이 발음 조합이 아님에도 불구하고 발음 가능한 단어로 취급받는 문제가 발생한다.


최종 아이디어 수정

“mwooa”와 같은 replace()를 통해 치환할 때 발생할 문제를 해결하기 위해 아이디어를 수정하였다.

  • 옹알이 단어 배열을 두어, 주어진 발음에서 옹알이 단어가 나오는지 확인한다.
    • 또한, 연속으로 옹알이 단어가 나오는지 확인하기 위해 연속 옹알이 조합 배열도 별도로 생성한다.
  • 주어진 발음 단어를 순회하며 연속된 옹알이인지 확인한다.
    • 연속된 옹알이는 올바른 옹알이가 아니기 때문에 카운트하지 않는다.
  • 주어진 발음 단어를 순회하며 올바른 옹알이인지 확인한다.
    • 주어진 발음 단어의 조합이 올바른 옹알이들로 이루어져있다면 "”로 “O”로 만든다.
  • 주어진 발음단어가 ““이라면 발음 가능한 옹알이로 조합되어 있다고 판단하고 카운트한다.
    주어진 발음단어가 “O”라는 문자로만 구성되어 있다면 발음 가능한 옹알이 조합으로 판단하고 카운트한다.


위 아이디어대로라면 “mwooa”의 경우에도 “mOa”로 잘못된 발음 조합으로 구분할 수 있다.
이제 수정한 아이디어대로 코드를 수정해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(String bab : babbling) {  
    for(String dbab : dupBabbling) {
        bab = bab.replace(dbab, "*");
    }
    for(String rbab : realBabbling) {
        bab = bab.replace(rbab, "O");
    }

    boolean babPossiable = true;
    for(int i=0; i<bab.length(); i++) {
        if(bab.charAt(i) != 'O') {
            babPossiable = false;
            break;
        }
    }
    if(babPossiable) possiableBabCnt++;
}

연속된 옹알이를 “*“로 치환하는 부분은 동일하고, 올바른 옹알이일 경우 ““가 아니라 “O”라는 문자로 치환한다.
그리고 치환된 발음 단어 bab을 살펴보고 “O”로 이루어졌다면 올바른 옹알이 조합이고, “O” 이외에 다른 문자가 존재한다면 발음 불가능한 옹알이 조합으로 판단하면 된다.



작성 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
    public static void main(String[] args) {

        // String[] babbling = {"aya", "yee", "u", "maa"};
        String[] babbling = {"ayaye", "uuu", "yeye", "yemawoo", "ayaayaa", "mwooa"};
        
        long start = System.currentTimeMillis();
        solution(babbling);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }
    
    public static int solution(String[] babbling) {
        String[] realBabbling = {"aya", "ye", "woo", "ma"};
        String[] dupBabbling = {"ayaaya", "yeye", "woowoo", "mama"};
        int possiableBabCnt = 0;

        for(String bab : babbling) {  
            for(String dbab : dupBabbling) {
                bab = bab.replace(dbab, "*");
            }
            for(String rbab : realBabbling) {
                bab = bab.replace(rbab, "O");
            }

            boolean babPossiable = true;
            for(int i=0; i<bab.length(); i++) {
                if(bab.charAt(i) != 'O') {
                    babPossiable = false;
                    break;
                }
            }
            if(babPossiable) possiableBabCnt++;
        }

        return possiableBabCnt;  
    }
}

회고

  • 충분히 고려할 수 있는 테스트케이스를 깊게 생각하지 않고 문제를 풀었기 때문에 문제 푸는 도중 코드를 수정하게 되었다.
    정해진 시간 내에 가능한 발생할 수 있는 경우의 수를 많이 생각하고 대입하여 최악을 대비하는 아이디어를 먼저 구상할 수 있도록 노력해야겠다.