diesuki4 2023. 2. 21. 08:08
Level 1. 옹알이 (2)

 

 

정규 표현식을 이용하여 해결했다.

 

각 단어를 숫자 하나로 교체한다.

교체된 숫자가 없으면 발음이 불가능한 단어다.

 

남은 알파벳을 제거한다.

제거된 알파벳이 있으면 발음이 불가능한 단어다.

 

연속된 숫자를 제거한다.

연속된 숫자가 있으면 발음이 불가능한 단어다.

 

#include <iostream>
#include <vector>
#include <unordered_map>
#include <regex>
#include <algorithm>

using namespace std;

int solution(vector<string> babbling)
{
    int answer = 0;
    unordered_map<string, string> words{{"aya", "0"}, {"ye", "1"}, {"woo", "2"}, {"ma", "3"}};

    for (string s : babbling)
    {
        size_t length = s.length();

        for (pair<string, string> pr : words)
            s = regex_replace(s, regex(pr.first), pr.second);

        if (length == s.length())
            continue;

        length = s.length();
        s = regex_replace(s, regex("[a-z]"), "");

        if (length != s.length())
            continue;

        length = s.length();
        s.erase(unique(s.begin(), s.end()), s.end());

        if (length != s.length())
            continue;

        ++answer;
    }

    return answer;
}

 

첫 번째 방법은 시간이 꽤 걸려 다른 방법을 찾아봤다.

 

인덱스를 계산하고 각 단어에 대응하는 flag를 저장해 해결한 풀이가 있었다.

 

사실 이 풀이로 풀려다가 정규 표현식을 연습하고 싶어서 첫 번째 풀이로 풀었다.

 

#include <iostream>
#include <vector>

using namespace std;

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

    for (string s : babbling)
    {
        char flag = '\0';
        bool isPronounceable = true;
        size_t length = s.length();

        for (int i = 0; i < length; ++i)
        {
            if (s.substr(i, 3) == "aya" && flag != 'a')
                flag = 'a', i += 2;
            else if (s.substr(i, 2) == "ma" && flag != 'm')
                flag = 'm', i += 1;
            else if (s.substr(i, 3) == "woo" && flag != 'w')
                flag = 'w', i += 2;
            else if (s.substr(i, 2) == "ye" && flag != 'y')
                flag = 'y', i += 1;
            else {
                isPronounceable = false; break; }
        }

        if (isPronounceable)
            ++answer;
    }

    return answer;
}