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;
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 1. 실패율 (0) | 2023.02.23 |
---|---|
Level 1. 카드 뭉치 (0) | 2023.02.22 |
Level 1. 명예의 전당 (1) (0) | 2023.02.20 |
Level 1. 완주하지 못한 선수 (0) | 2023.02.19 |
Level 1. 과일 장수 (0) | 2023.02.18 |