하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 13022 늑대와 올바른 단어 C++

긤효중 2022. 4. 15. 16:19

https://www.acmicpc.net/problem/13022

 

13022번: 늑대와 올바른 단어

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

www.acmicpc.net


문제

다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.

  1. 임의의 양의 정수 n에 대해서, 'w'가 n번 나오고, 그 다음에 'o'가 n번, 그 다음에 'l'이 n번, 그 다음에 'f'가 n번 나온 단어는 올바른 단어이다.
  2. 올바른 단어 두 개를 이은 단어도 올바른 단어이다.
  3. 1번과 2번 조건으로 만들 수 있는 단어만 올바른 단어이다.

다음은 올바른 단어의 예시이다.

  • 1번 규칙으로 만든 "wolf", "wwoollff", "wwwooolllfff"는 모두 올바른 단어이다.
  • 2번 규칙으로 만든 "wolfwwoollff"은 올바른 단어이다.
  • 2번 규칙을 두 번 써서 만든 "wolfwwoollffwolf"은 올바른 단어이다.
  • "wfol"은 올바른 단어가 아니다. (순서가 올바르지 않음)
  • "wwolfolf"는 올바른 단어가 아니다. (문자열의 중간에 다른 문자열을 집어 넣음)
  • "wwwoolllfff"는 올바른 단어가 아니다. (o가 2번 들어갔다)

입력

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


출력

입력으로 주어진 단어가 올바른 단어인 경우에는 1을, 아니면 0을 출력한다.


해결방안 -> 양의 정수 n에 대해서 w가 n번 나오고, o가 n번,l가 n번,f가 n번 순차적으로 나와야 한다.

w,o,l,f의 개수를 세는 배열 하나를 만들고, 올바른 단어인지 알려주는 bool변수 하나를 선언한다

(올바르면 1,아니면 0)

 

문자열의 길이만큼 돌면서 w가 나오면 배열[0]을 증가시키고, o가 나오면 배열[1]을 증가시키고, l이 나오면 배열[2]를 , f가 나오면 배열[3]을 증가시킨다.

 

이떄, f가 나왔고 f의 다음 번쨰 문자가 w일떄,

배열[0],배열[1],배열[2],배열[3]의 개수가 다르면 올바르지 않는 단어이다.

그리고 i번쨰 원소가 'w','o','l','f'일떄 올바른 단어인지 확인해주고,

 

마지막으로 배열의 개수가 서로 다르면 올바르지 않은 단어로 여긴다.


전체 소스 코드->

#include <iostream>
#include <vector>
#include <string>
using namespace std;
//백준 13022 늑대와 올바른 단어

 

int main(void){
    vector<char> v;
    int num[4] = {0, }; //'w,o,l,f의 개수를 담을 배열'
    string str;
    cin >> str;
    bool is_correct = true;
   
    for(int i = 0;i<str.size();i++){
        if(str[i] == 'w'){ //w인경우
            num[0]++;
        }
        else if(str[i] == 'o'){ //o인경우
            num[1]++;
           
        }
        else if(str[i] == 'l'){ //l인경우
            num[2]++;
           
        }
        else if(str[i] == 'f'){ //f인경우
            num[3]++;
            if(str[i+1] == 'w'){ //만약 wolf가 한 단위라면(f다음 w가왔을때)
                  for(int i = 0;i<4;i++){
                   for(int j = 0;j<4;j++){
                       if(num[i] != num[j]){
                           is_correct = false; //num값이 서로 다르면 올바르지 않은 문자열
               }
           }
       }
            }
        }
 
        if(i>=1){ //i가 1이상일떄
            if(str[i] == 'w'){
                if(str[i-1] == 'w' || str[i-1] == 'f'){ //이 경우만 올바른 단어
                    v.push_back(str[i]);
                }
                else{
                    is_correct = false;    
                }
            }
            else if(str[i] == 'o'){
                if(str[i-1] == 'o' || str[i-1] == 'w'){//이 경우만 올바른 단어
                    v.push_back(str[i]);
                }
                else{
                    is_correct = false;
 
                }
            }
            else if(str[i] == 'l'){
                if(str[i-1] == 'l' || str[i-1] == 'o'){//이 경우만 올바른 단어
                    v.push_back(str[i]);
                }
                else{
                    is_correct = false;
                }
            }
            else if(str[i] == 'f'){
                if(str[i-1] == 'l' || str[i-1] == 'f'){//이 경우만 올바른 단어
                    v.push_back(str[i]);
                }
               
                else{
                    is_correct = false;
                   
                }
            }
        }
 
    }
 
    for(int i = 0;i<4;i++){ //num배열의 값이 다르면 올바르지 않은 단어
       for(int j = 0;j<4;j++){
           if(num[i] != num[j]){
               is_correct = false;
           }
       }
    }
 
    if(is_correct == false){
        cout << '0';
    }
    else{
        cout << '1';
    }
 
 
}