문제

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


입력

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

항상 느끼는 거지만 문자열 관련 문제는 푸는 것 자체는 어렵지 않지만 짧은 코드로 문제를 해결하는 다른 사람들을 보면 항상 감탄하는 것 같다.

나는 주어진 문자열에 대해 먼저 앞에서부터 2번째까지 잘라 가능한 발음인지 확인하고 가능하지 않다면 

앞에서부터 3번째까지 잘라 다시 가능한 발음인지 검사하며 조건에 부합하는 발음인지 확인하는 방식으로 구현했다.

요악하자면 아래와 같다.

 

1.bab.substr(0, 2), 검사 : "ye" 혹은 "ma"와 일치하는지 검사

->가능한 발음이면 bab = bab.substr(2) 이후 다시 1번부터 진행 불가능한 발음이면 2번 진행

 

2.bab.substr(0,3), 검사 : "aya" 혹은 "woo"와 일치하는지 검사

->가능한 발음이면 bab = bab.substr(3) 이후 다시 1번부터 진행 불가능한 발음이면 3번 진행

 

3.불가능한 발음이 포함 된 경우이므로 검사 중단

 

#include <string>
#include <vector>
#include <iostream>
using namespace std;

string canList[] = { "aya", "ye", "woo", "ma" }, previous;

bool check_pronunciation(string pronunciation) {
    if (pronunciation == previous) return false;
    for (int i = 0; i < 4; i++)
        if (pronunciation == canList[i]) return true;
    return false;
}

int main() {
    int answer = 0;
    vector<string> babbling = { {"ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"} };
    /*vector<string> babbling = { {"aya", "yee", "u", "maa"} };*/
    for (int i = 0; i < babbling.size(); i++) {
        previous = "";
        string bab = babbling[i];
        int flag = 1;
        while (bab.length() > 0) {
            //1."ye", 혹은 "ma"와 일치하는지 검사
            string check = bab.substr(0, 2);
            if (check_pronunciation(check)) {
                previous = check;
                bab = bab.substr(2);
                continue;
            }
            //2."aya" 혹은 "woo"와 일치하는지 검사
            check = bab.substr(0, 3);
            if (check_pronunciation(check)) {
                previous = check;
                bab = bab.substr(3);
                continue;
            }
            //3.발음이 불가능한 발음이 포함 된 경우 while문 종료
            flag = 0;
            break;
        }
        
        if (flag) answer++;
    }
    cout << answer;
    return answer;
}

 

더 효율적인 코드로 아래는 thooX2님의 풀이이다. 

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> babbling)
{
    int answer=0;

    for(string s : babbling)
    {
        int flag=0; bool j=true;
        for(int i=0; i<s.length(); i++)
        {
            if(s.substr(i,3)=="aya" && flag!=1) { flag=1; i+=2; }
            else if(s.substr(i,2)=="ma" && flag!=2) { flag=2; i+=1; }
            else if(s.substr(i,3)=="woo" & flag!=3) { flag=3; i+=2; }
            else if(s.substr(i,2)=="ye" && flag!=4) { flag=4; i+=1; }
            else { j=false; break; }
        }
        if(j==true) answer++;
    }

    return answer;
}