본문 바로가기

백준

13022 늑대와 올바른 단어

 

상태 기억 오토마타? 용어가 기억 안 나네

문자열의 상태를 나눈 다음 상태에 맞는 동작을 확인했다.

 

이 문제는 두 번 틀렸었다.

코드를 보면 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;
}

'백준' 카테고리의 다른 글

14729 칠무해  (0) 2020.11.10
2688 줄어들지 않아  (0) 2020.11.06
6064 카잉 달력  (0) 2020.11.06
2823 유턴 싫어  (0) 2020.11.06
15735 삼각  (0) 2020.11.03