백준
13022 늑대와 올바른 단어
불타는강정
2020. 11. 6. 16:41
상태 기억 오토마타? 용어가 기억 안 나네
문자열의 상태를 나눈 다음 상태에 맞는 동작을 확인했다.
이 문제는 두 번 틀렸었다.
코드를 보면 state = 4일 때 w가 들어와야 길이를 확인하게끔 했는데 이 부분이 문제였다.
wolf 다음 f로 끝난다면 마지막 f는 확인을 안 한다..!
게다가 마지막 문자가 f인지 확인하는 부분도 빼먹었다.
마지막 상태가 4로 끝나는지, 마지막에 다시 한번 f의 길이를 확인하는 부분을 넣어줬더니 맞았다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
int main()
{
string s;
cin >> s;
int state = 0;
int w_cnt = 1;
int cnt = 1;
bool ans = true;
for (int i = 0; i < s.size(); i++)
{
if (state == 0)
{
if (s[i] == 'w')
state = 1;
else
ans = false;
}
else if (state == 1)
{
if (s[i] == 'o')
{
state = 2;
cnt = 1;
}
else if (s[i] == 'w')
w_cnt++;
else
ans = false;
}
else if (state == 2)
{
if (s[i] == 'l')
{
state = 3;
if (cnt != w_cnt)
ans = false;
cnt = 1;
}
else if (s[i] == 'o')
cnt++;
else
ans = false;
}
else if (state == 3)
{
if (s[i] == 'f')
{
state = 4;
if (cnt != w_cnt)
ans = false;
cnt = 1;
}
else if (s[i] == 'l')
cnt++;
else
ans = false;
}
else
{
if (s[i] == 'w')
{
state = 1;
if (cnt != w_cnt)
ans = false;
w_cnt = 1;
}
else if (s[i] == 'f')
cnt++;
else
ans = false;
}
}
if (state != 4)
ans = false;
if (cnt != w_cnt)
ans = false;
if (ans)
printf("1\n");
else
printf("0\n");
return 0;
}