본문 바로가기
알고리즘/백준

백준 1316번 그룹 단어 체커 [C++]

by seongjun 2023. 11. 23.

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

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

#include <iostream>
#include <string>

using namespace std;

int main(){
    int n;
    cin >> n;
    string arr[n];
    for(int i=0;i<n;i++){
        cin >> arr[i];
    }
    int answer = n;
    for (int i=0;i<n;i++){
        char check = arr[i][0];
        while(!arr[i].empty()){
            if(arr[i].find(check) == 0){
                arr[i].replace(0,1,"");
            }else if(arr[i].find(check) == string::npos){
                check = arr[i][0];
            }else if(arr[i].find(check) != 0){
                answer -= 1;
                break;
            } 
        }
    }
    cout << answer;
}

총 들어온 단어의 개수에서, 그룹단어가 아닌 경우 하나씩 빼준다.

반복문을 돌며 첫 번째 글자를 find했을 때의 결과값이 0인 경우 지속적으로 첫 번째 글자를 제거해주고, 결과값이 0이 아닌 경우는 연속해서 나오는 것이 아니라는 의미이므로 그룹 단어 개수 - 1 을 해주고 반복문을 종료한다.

find의 결과값이 npos인 경우는 더 이상 해당 글자가 없으므로, 남은 문자열에서 새로 지워나갈 글자인 맨 앞 글자로 바꿔준다.