[문제]
머쓱이는 태어난 지 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 |