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

- 입출력 예 #1 :
["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은"aya"뿐입니다. 따라서 1을 return합니다.
- 입출력 예 #2 :
["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은"aya" + "ye" = "ayaye","ye" + "ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.
네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어
"woowo"는"woo"는 발음할 수 있지만"wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
❌ 조카가 할 수 있는 발음을
baby에 저장하고,babbling의 각 요소가baby내의 요소를 포함하고 있으면 해당 단어를 공백""으로 바꿔주었다. 이 때, 연속된 발음은 할 수 없으므로 단어가 연속된 경우,replaceFirst()를 사용하여 같은 단어의 첫 번째 요소만 공백으로 변환하였다.baby의 모든 요소와 비교를 마친 후, 최종babbling[i]가 공백이면 모두 발음할 수 있다는 의미이므로answer를 1 증가시킨다.
아래 코드로 예제는 통과하였으나, 실제 제출에서는 절반 정도의 케이스만 통과하였다. 반례를 생각해보니ayawooaya의 경우,aya가 2개 있지만 연속되지 않았기 때문에 두aya모두 발음할 수 있어야 하는데,replaceFirst()에 의해 뒤의aya가 공백으로 대체되지 않았다,,
class Solution {
public int solution(String[] babbling) {
String[] baby = {"aya", "ye", "woo", "ma"};
int answer = 0;
for(int i=0;i<babbling.length;i++) {
for(int j=0;j<baby.length;j++) {
babbling[i] = babbling[i].replaceFirst(baby[j], "");
}
if(babbling[i].equals("")) answer++;
}
return answer;
}
}

❌ 그냥 단순하게
babblin[i]가 반복된 단어를 포함하지 않는 경우에만replace(baby, "")를 수행하도록 조건문을 추가해줬다! 근데 해당 코드도 절반 정도의 케이스만 통과,, 심지어 전에 맞던 것도 틀림,,
울면서 반례를 또 찾아보니""으로 대체해버리면 남은 단어들이 붙어서 기존에 없던baby요소를 만들어 낼 수 있다고 한다,,
예를 들어ayamayaa의 경우aya + ma + yaa이므로 발음할 수 없는 단어이지만,aya를""로 대체하면aya/m/aya/a가ma가 되어ma차례에서 해당 요소를baby속 요소라 생각하여 공백으로 대체해버리면 결론적으로 발음할 수 있는 단어가 되어버린다,,!
...
for(int i=0;i<babbling.length;i++) {
for(int j=0;j<baby.length;j++) {
if(!babbling[i].contains("ayaaya") &&
!babbling[i].contains("yeye") &&
!babbling[i].contains("woowoo") &&
!babbling[i].contains("mama")) {
babbling[i] = babbling[i].replace(baby[j], "");
}
...

✅ 대체 후 단어들이 붙지 않게 하기 위해서,
""대신" "로 대체해주었다! 모든 대체가 끝난 후replace(" ", "")를 통해" "를""로 대체하면, 단어들이 붙어도 대체 작업은 이미 끝났기 때문에 상관없다. 공백 대체 작업까지 끝낸 문자열이""이면answer를 증가시킨다.
for(int i=0;i<babbling.length;i++) {
for(int j=0;j<baby.length;j++) {
if(!babbling[i].contains("ayaaya") &&
!babbling[i].contains("yeye") &&
!babbling[i].contains("woowoo") &&
!babbling[i].contains("mama")) {
babbling[i] = babbling[i].replace(baby[j], " ");
}
}
if(babbling[i].replace(" ", "").equals("")) answer++;
}
...
