백준

백준 1316 c++ 풀이

ris 2024. 7. 14. 18:00

이번 문제는 굉장히 간단한 문제였다.

물론 필자는 오래걸렸다.

 

다음은 올바른 코드이다.

#include<iostream>
#include<string>
using namespace std;
int main(){
    int a[26] = {0,};
    int t;
    int cnt = 0;
    bool pass = false;
    string input;
    
    cin >> t;
    for(int i =  0; i < t; i++){
        cin >> input;
        pass = true;
        for(size_t j = 0; j < input.length(); j++){
            if(j != 0 && a[static_cast<int>(input[j]) - 97] == 1 && input[j-1] != input[j]){
                pass = false;
                break;
            } // index 0 제외, 문자가 이미 있을 때, 바로 앞의 문자가 나와 다를 때
            a[static_cast<int>(input[j]) - 97] = 1; // a의 ascii = 97
            
        }
        if(pass){
            cnt++;
        }
        fill(begin(a), end(a), 0);
    }
    cout << cnt;
    return 0;
}

 

복잡해보이지만 천천히 보면 굉장히 간단한 과정을 거친다.

문제에서는 문자열이 주어질 때 그 문자열에서 각 문자가 연속해서 나타나는 경우만을 말한다.

고로 연속해서 나타나지 않는 경우를 제하고 남은 것만들 더하면 된다.

연속하지 않는 경우 : 이미 나온 문자임에도 연속하지 않고 나온 경우.

 

string 라이브러리를 사용해 입력받았고 이미 나온 알파벳의 확인을 위해 임의의 배열을 생성했다.

그리고 한 글자씩 확인해 넣었고 만일 해당 문자가 이미 나온 문자이고 바로 전 문자가 해당 문자와 다를 경우에 반복을 취소, 다른 문자를 받아왔다.

 

굉장히 간단한 문제임에도 세세한 부분이 꽤나 복잡했던 문제였다.