https://school.programmers.co.kr/learn/courses/30/lessons/133499
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
babbling | result |
---|---|
["aya", "yee", "u", "maa"] | 1 |
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] | 2 |
class Solution {
public int solution(String[] babbling) {
int answer = 0;
for (int i = 0; i < babbling.length; i++) {
//같은 발음을 연속으로 하지 못하기 때문에
//그 경우의 수를 제외시킨다
if (babbling[i].contains("ayaaya") || babbling[i].contains("yeye") ||
babbling[i].contains("woowoo") || babbling[i].contains("mama"))
continue;
//정규식을 이용해 aya, ye, woo, ma의 발음만으로 구성되는 문자열만 카운트한다
if (babbling[i].matches("(aya|ye|woo|ma)+"))
answer++;
}
return answer;
}
}
class Solution {
public int solution(String[] babbling) {
int answer = 0;
for(int i = 0; i < babbling.length; i++) {
if(babbling[i].contains("ayaaya") || babbling[i].contains("yeye") ||
babbling[i].contains("woowoo") || babbling[i].contains("mama")) {
continue;
}
//그냥 replace대신 replaceAll메서드를 이용해 정규식을 써서
//babbling[i] = babbling[i].replaceAll("(aya|ye|woo|ma)", "");
//이 한줄로 적는게 나을거 같다
babblings[i] = babblings[i].replace("aya", " ");
babblings[i] = babblings[i].replace("ye", " ");
babblings[i] = babblings[i].replace("woo", " ");
babblings[i] = babblings[i].replace("ma", " ");
babblings[i] = babblings[i].replace(" ", "");
if(babbling[i].length() == 0) answer++;
}
return answer;
}
}
이번 문제도 정규식에서 오래 걸렸다.
일단 연속적인 경우는 제외했기 때문에 발음에 해당하는 문자열만 골라내면 되는데
처음엔 "[aya|ye|woo|ma]+" 이렇게 []를 써야되는줄 알고 한참을 해맸다..
알고보니 []는 하나의 문자만 의미한다.. aya처럼 하나의 문자열로 그루핑을 하려면 ()를 썼어야 했다.
저것은 "[ayewom]+" 이렇게 쓴거나 다름없다. a, y, e, w, o, m가 하나라도 포함되면 매칭되는 것이다.
문제에 맞게 쓸려면 정규식을 다음과 같이 써야 한다.
babbling[i].matches("(aya|ye|woo|ma)+");