백준/Inha Algorithm Study Group

DAY2 고급 - 백준 13022번 (C++)

FDEE 2020. 9. 4. 00:38

www.acmicpc.net/problem/13022

 

13022번: 늑대와 올바른 단어

첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.

www.acmicpc.net

 

<답안>

#include <iostream>
using namespace std;
int main()
{
    char input = ' ';
    int count[4] = {0};
    
    while(input != '\n')
    {
        cin.get(input);
        //주기상 처음, w 입력
        if(input == 'w')
        {
            count[0]++;
        }
        //종료 입력
        else if(input == '\n')
        {
            //주기상 정상종료
            if(count[0] == 0)
            {
                cout<<1;
                return 0;
            }
            //주기상 비정상종료
            else
            {
                cout<<0;
                return 0;
            }
        }
        //그 외 문자 입력
        else
        {
            if(input == 'o')
            {
                count[1]++;
                while(count[1] != count[0])
                {
                    cin.get(input);
                    if(input != 'o')
                    {
                        cout<<0;
                        return 0;
                    }
                    count[1]++;
                }
                while(count[2] != count[0])
                {
                    cin.get(input);
                    if(input != 'l')
                    {
                        cout<<0;
                        return 0;
                    }
                    count[2]++;
                }
                while(count[3] != count[0])
                {
                    cin.get(input);
                    if(input != 'f')
                    {
                        cout<<0;
                        return 0;
                    }
                    count[3]++;
                }
                //정상적으로 반복이 종료된 경우
                for(int i=0; i<4; i++)
                    count[i] = 0;
            }
            //이상한 문자 입력
            else
            {
                cout<<0;
                return 0;
            }
        }
        
    }
    return 0;
}

 

<설명>

문제이해가 안되어 접근조차 하지 못할정도로 어려운 문제는 아니였지만

꼼꼼하게 한번에 잘풀리지가 않아 난해를 겪었던 문제였다

 

가장 심플한 알고리즘으로, w를 계속 입력받으며 개수를 센 다음 (count[0])

다음으로 입력되는 o,l,f 개수가 같은지 여부를 확인하며 (count[1],[2],[3])

맞는경우 다시 w를 입력받을 준비를 하면 되는 식이다

 

이번엔 string형 대신 char형을 계속해서 입력받는 식으로 구현하였다

- 'w'가 입력됬을시는 count[0]을 증가

- '\n'가 입력됬을시

   1. wolf가 정상적으로 다 돌아 count[0]이 0인 경우 -> 1 출력하며 정상종료

   2. count[0]이 0이 아니여서 중간에 다른문자 또는 그냥 개행이 입력된 경우 -> 0 출력하며 비정상종료

- 그외 문자가 입력됬을시

   - 입력문자가 'o'가 맞는경우

      count[1]증가

      count[1]이 count[0] 개수랑 같을때까지 반복하며 입력받는값이 'o'인지를 계속 비교한다

      'o'이 아닌값이 입력된 경우 0 출력하며 비정상종료

 

      count[2]이 count[0] 개수랑 같을때까지 반복하며 입력받는값이 'l'인지를 계속 비교한다

      'l'이 아닌값이 입력된 경우 0 출력하며 비정상종료

 

      count[3]이 count[0] 개수랑 같을때까지 반복하며 입력받는값이 'f'인지를 계속 비교한다

      'f'이 아닌값이 입력된 경우 0 출력하며 비정상종료

 

      이렇게 비교를 통해 계속 입력받아 온 경우 정상적인 반복입력이 종료된 경우이므로

      count[0],[1],[2],[3]을 다시 0으로 초기화 해준다

   - 입력문자가 'o'이 아닌경우

      0을 출력하며 비정상종료

 

이러한 구조로 w개수를 기준으로 계속 비교를 통해 구현할 수 있다