PS_Baekjoon

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

SMILELY 2023. 2. 28. 00:40

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

풀이 :

- 문자열에 한번만 등장하거나, 여러번 등장해도 연속한다면 그룹 단어다

- 이전에 등장했는데 연속하지 않을 경우 카운트하지 않는다

 

코드 :

#include <iostream>
#include <set>
using namespace std;

int main() {
    int ans, n;
    string s;
    set<int> alphabet; // 이전에 등장했는지 파악하기 용이한 set 선언. int지만 아스키코드로 넣어지기 때문에 상관없음
    bool res; // 그룹단어인지 판별하는 변수

    cin >> n;
    ans = 0;
    while(n--){
        alphabet.clear(); // 문자열이 들어올 때마다 체크해야 해서 새 문자열이 들어오기 전 초기화
        cin >> s;
        res = true; // res값도 true로 초기화
        for(int i=0; i<s.size(); i++){
            if((alphabet.count(s[i]) == 1) && (s[i-1] != s[i])){ //1인 경우 이미 등장했다는 것
                res = false; //등장했지만 이전 인덱스 값이랑 다르다 = 연속하지 않는 것
                break; //그룹단어가 아니라면 굳이 더 볼 필요가 없기 때문에 break한다 
            }
            alphabet.insert(s[i]); //if문에 걸리지 않았다는 것은 새롭게 등장했거나 연속된다는 것
        }                          //set은 중복을 허용하지 않기 때문에 계속 넣어도 하나의 값만 들어간다
        if(res){ //res가 true라는 것은 그룹단어가 맞다는 것
            ans++;
        }
    }
    cout << ans << endl;
}