알고리즘

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

winwin-k9 2023. 6. 26. 02:42

문제

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다.

조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다.

문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

풀이

문자열을 대체하는 방법으로 풀이하였다.
원래는 문자열을 지우는 방식으로 코드를 짰었다.
그러나 yayae와 같은 문자가 있다고 하면 먼저 aya를 삭제하면 앞의 y와 뒤의 e가 붙어버려서 ye 가 되기 때문에 또 가능한 언어가 된다.
따라서 삭제가 아니라.으로 대체하는 방법을 사용했다.

또한 check하는 부분에서 한번 문자를 삭제한 후 위에 또 같은 word가 가능할 수 있기 때문에 i--를 함으로써 뒤에 있는 부분까지 대체가 가능하도록 했다.
반례를 찾느라 꽤나 고생을 했다.
반례를 찾는 연습을 더 해야 겠다.

import java.util.*;
import java.lang.*;

class Solution {
    static String[] words = {"aya", "ye", "woo", "ma"};
    static String[] duplicatedWords = {"ayaaya", "yeye", "woowoo", "mama"};
    public int solution(String[] babbling) {
        int answer = 0;
        for(int i = 0; i < babbling.length; i++) {
            StringBuilder str = new StringBuilder(babbling[i]);
            if(duplicatedCheck(str)) {
                continue;
            }

            if (check(str)) {
                answer++;
            }

        }
        return answer;
    }

    static boolean check(StringBuilder str) {
        for(int i = 0; i < 4; i++) {
            int index = str.indexOf(words[i]);
            if (index == -1) {
                continue;
            }
            str.replace(index, index + words[i].length(), ".");
            i--;
        }

        for(int i = 0; i < str.length(); i++) {
            if (!str.substring(i, i + 1).equals(".")) {
                return false;
            }
        }

        return true;
    }

    static boolean duplicatedCheck(StringBuilder str) {
        for(int i = 0; i < 4; i++) {
            if ((str.toString()).contains(duplicatedWords[i])) {
                return true;
            }
        }

        return false;
    }
}

https://github.com/Win-9/Algorism/tree/main/programers/%EC%98%B9%EC%95%8C%EC%9D%B4(2)

728x90