출처: https://school.programmers.co.kr/learn/courses/30/lessons/133499
문제 설명
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 30
문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예
babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2
입출력 예 설명
입출력 예 #1
["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.
입출력 예 #2
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.
유의사항
네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
※ 공지 - 2024년 2월 20일 문제 지문의 오탈자가 수정되었습니다.
30분동안 작성한 코드문
코드를 입력하세요
import java.util.*;
class Solution {
public int solution(String[] babbling) {
int answer = 0;
// aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다.
// 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return
// 마찬가지로 해당 배열 원소에 다른 배열 원소가 포함됐는지 여부
String arr[] = {"aya", "ye", "woo", "ma"};
// String형 스택 선언
Stack<String> stackStr = new Stack<>();
for(int i = 0; i < babbling.length; i++){
for(int j = 0; j < arr.length; j++){
if(babbling[i].contains(arr[j])){
answer++;
}
}
}
return answer;
}
}
arr배열을 선언하여, 옹알이 배열원소에 arr배열원소가 포함되어있는지를
판단해야 한다고 생각하여 코드문을 작성했다.
하지만, 현재 코드의 문제점은..
contains()로 포함 여부만 판단하면, "woowoo"도 "woo" 포함이니까 세어져 버린다.
반복 발음이 있는지도 확인하지 않음 ❌
부분 포함만으로는 안 되고, 전체 문자열이 정확히 유효한 발음으로만 구성되어 있는지, 그리고 연속 반복이 없는지를 확인해야 한다.
요구사항을 만족하는 풀이
public int solution(String[] babbling) {
int answer = 0;
String[] canSpeak = {"aya", "ye", "woo", "ma"};
for(String word : babbling) {
String prev = ""; // 직전에 발음한 단어
String tmp = word; // 검사를 위해 word를 복사
boolean isValid = true; // 이 단어가 조건에 맞는지 여부
while(tmp.length() > 0) { // 단어가 남아있는 동안 계속 검사
boolean matched = false; // 이번 루프에서 유효한 발음을 찾았는지
for(String p : canSpeak) { // tmp의 앞부분이 p(네 발음 중 하나)로 시작하는지 확인
if(tmp.startsWith(p) && !p.equals(prev)) { // 그리고 직전 발음(prev)과 같지 않아야 함 → 중복 방지
tmp = tmp.substring(p.length()); // 유효한 발음 제거
prev = p; // 이번 발음을 prev에 저장
matched = true; // 유효한 발음 찾았음 표시
break; // 더 이상 검사 안 해도 됨
}
}
if(!matched) { // 4개 발음 중 아무것도 못 찾았다면 → 잘못된 단어 → 검사 중지
isValid = false;
break;
}
}
if(isValid) answer++; // 유효한 단어였다면 정답 카운트 증가
}
return answer;
}
머쓱이 조카가 발음할 수 있는 네 가지 단어 리스트
String[] canSpeak = {"aya", "ye", "woo", "ma"};
for(String word : babbling) {
babbling 배열을 하나씩 돌면서 검사
String prev = ""; // 직전에 발음한 단어
String tmp = word; // 검사를 위해 word를 복사
boolean isValid = true;// 이 단어가 조건에 맞는지 여부
while(tmp.length() > 0) {
단어가 남아있는 동안 계속 검사
boolean matched = false; // 이번 루프에서 유효한 발음을 찾았는지
for(String p : canSpeak) {
if(tmp.startsWith(p) && !p.equals(prev)) {
tmp의 앞부분이 p(네 발음 중 하나)로 시작하는지 확인
그리고 직전 발음(prev)과 같지 않아야 함 → 중복 방지
tmp = tmp.substring(p.length()); // 유효한 발음 제거
prev = p; // 이번 발음을 prev에 저장
matched = true; // 유효한 발음 찾았음 표시
break; // 더 이상 검사 안 해도 됨
}
if(!matched) {
isValid = false;
break;
}
4개 발음 중 아무것도 못 찾았다면 → 잘못된 단어 → 검사 중지
if(isValid) answer++;
유효한 단어였다면 정답 카운트 증가
그외에 풀이
class Solution {
public int solution(String[] babbling) {
int answer = 0;
for(int i=0; i<babbling.length; i++){
babbling[i] = babbling[i].replaceAll("ayaaya|yeye|woowoo|mama","1");
babbling[i] = babbling[i].replaceAll("aya|ye|woo|ma"," ");
babbling[i] = babbling[i].replaceAll(" ","");
if(babbling[i].equals("")) answer++;
}
return answer;
}
}