본문 바로가기
문제풀이/프로그래머스

[JAVA,Lv.1] 옹알이(2)

by PhoB 2023. 1. 3.

[문제]

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

 

<입출력 예시>

babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2


[제한사항]

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


[풀이 과정]

문제를 보는순간 대학 강의에서 배웠던 문자열 매칭이 생각나 간만에 책을 펼쳐보게되었다.

하지만 배웠던 그것과는 조금 다른 문제였다.

처음에는 contains()와 replace()메소드를 이용해서 풀이를 시도했다.

그결과

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        String[] word = new String[]{"aya", "ye", "woo", "ma"};
        for(String babe : babbling){
            if(step2(babe))answer++;
        }
        return answer;
    }
    
    
    private static boolean step2(String text){
        String[] word = {"aya", "ye", "woo", "ma"};
        String[] repeat = {"ayaaya", "yeye", "woowoo", "mama"}; //연속되는 문자열 확인
        
        for(String Rcheck : repeat){
            if(text.contains(Rcheck)) return false;
        }
        for(String keyword : word){
              if(text.contains(keyword)){
                text=text.replace(keyword,"");
                if(text.isEmpty())return true;
                else if(step2(text))return true;
            }
        }
        return false;   
    }
    
    
    
}

 

이런식으로 재귀적인 방식을 통해서 코드를 작성하였고, 테스트케이스는 모두 통과하였다.

하지만 채점에서는 60점밖에 받지 못하였고 9번~14번 , 16번 , 19~20번에서 오류가 나며 실패하였다. 그렇게 한참들 들여다보고 질문하기도 왔다갔다 하면서 원인을 찾았다.

 



[오류 원인 및 해결]

 

위 코드의 문제점은 문제조건에서 발음가능한 단어 "aya", "ye", "woo", "ma"  이렇게 4가지단어만을 붙여서 만든 단어여야한다.

하지만 위 코드에서는 myea같은 경우도 발음 가능한 경우로 취급하는데

ayeya ㅡ[ye제거]ㅡ>aya ㅡ[aya제거]ㅡ> 0

이런식으로 붙여만든 단어가 아님에도 true를 리턴하게 되어 오류가 발생하는 것이다.

때문에 이런 방식을 버리고 split를 사용하게 되었다.



[내 풀이]

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        for(String babe : babbling){
            if(step2(babe))answer++;
        }
        return answer;
    }
    private static boolean step2(String text){
        String[] word = {"aya", "ye", "woo", "ma"};
        String[] repeat = {"ayaaya", "yeye", "woowoo", "mama"}; //연속되는 문자열 확인
        for(String Rcheck : repeat){
            if(text.contains(Rcheck)) return false;
        }
        String[] sp = text.split("aya|ye|woo|ma"); //정규식, "|"은 or역할
        if(sp.length ==0)return true;
        return false;   
    }
}

이런식으로 split()을 하면 기준문자가 사라지는점을 이용해서 가능단어들로 split하여 확인하는 것이다.

 

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[JAVA , Lv.1] 삼총사  (0) 2023.01.05
[JAVA , Lv.1] 콜라 문제  (0) 2023.01.05
[JAVA , Lv.1] 기사단원의 무기  (0) 2022.12.31
[JAVA , Lv.1] 명예의 전당 (1)  (0) 2022.12.31
[JAVA , Lv.1] 문자열 나누기  (0) 2022.12.31