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

진예·2024년 1월 2일
0

Programmers

목록 보기
37/45
post-thumbnail

📌 문제

Lv1. 옹알이(2)

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

✔️ 제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 30
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

✏️ 입출력

  1. 입출력 예 #1 : ["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

  2. 입출력 예 #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/ama가 되어 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++;
}

...

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글