백준 algorithm

백준 1316 - 그룹 단어 체커

cosmohoo 2020. 6. 4. 01:37
반응형

문제 설명

 

 

=> 단순한 구현 문제입니다. 

=> string을 사용하고 bool형 array를 사용하여 구현할 수 있습니다. 

 

 

  • 알파벳을 담을 bool형 array를 생성합니다. 

  • 현재의 단어의 글자를 탐색하며 처음 나온 알파벳인지, 나왔던 알파벳인지를 확인합니다.

  • 처음 나온 알파벳일 경우, 해당 알파벳을 방문했다고 표시해줍니다.

  • 처음 나온 알파벳이 아닐 경우, 이전 알파벳과 같은 알파벳인지, 같지 않은지 확인합니다.

  • 같지 않을 경우 그룹 단어에 해당이 안됩니다. 

  • 해당하는 경우에 okay라는 bool형 변수를 true로 바꿔주고, 해당 변수를 통해 단어의 개수를개수를 세는 cnt의 개수를 올릴지 말지 정합니다.

  • 모든 순서가 끝나면 방문하였던 알파벳 arr를 초기화시켜주고, okay 변수 또한 초기화 시켜줍니다. 

 

=> 저는 이와 같은 알고리즘으로 문제를 해결했습니다. 

 

 

 

 

 

<code>

#include <iostream>
#include <algorithm>
#include <string>

int arr[10];

using namespace std;

bool alphabet[27];

void reset()
{
    for(int i=0; i<27; i++)
    {
        alphabet[i]=false;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    int N;
    cin >> N;
    
    string arr[101];
    string str;
    
    for(int i=0; i< N; i++)
    {
        cin >> str;
        arr[i] =  str;
    }
    
    int cnt =0;
    bool okay;
    for(int i=0; i<N; i++)
    {
        string tmp = arr[i];
        int len = tmp.length();
        
        for(int j=0; j<len; j++)
        {
            if(!alphabet[tmp[j]-97]) // 한번도 나오지 않은 경우
            {
                alphabet[tmp[j]-97]=true; // 나온것 확인
            }
            else //나왔던 알파벳인 경우
            {
                if(tmp[j] ==tmp[j-1] )//이전것이 연속인 경우
                {
                    continue;
                }
                else//이전것과 다른 경우
                {
                    okay = true; // 집합의 단어가 아님
                    break;
                }
            }
        }
        if(okay != true) //적합한 단어라면
        {
            cnt++;
            okay =false;
        }
        reset();
        okay = false;
    }
    
    cout << cnt <<'\n';
    
    return 0;
}

 

 

 

실행 화면
실행화면 2

 

 

 


**훨씬 간단한 방법이 있을 것이라 생각되지만, 생각나는 대로 구현해본 코드입니다. 
**질문 환영합니다. 

반응형