본문 바로가기

PS_Baekjoon

[백준 C++] 9324번 : 진짜 메시지

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

 

9324번: 진짜 메시지

스파이들은 사령부와 통신하기 위해서 SMTP(비밀 메시지 전송 프로토콜)를 사용해 비밀 회선으로 전자 메시지를 보낸다. 메시지가 적들에 의해 조작되어 보내진 것이 아닌 진짜 메시지라는 것

www.acmicpc.net

풀이 :
- 주어진 문자열을 탐색하며 같은 문자가 3번째로 등장할 때마다 다음 문자와 같은지의 여부에 따라 ok/fake가 결정된다
- 주의할 것은 문제에서 3번째라고 적혀있어서 정말 3번째에 등장할 때만 고려하면 되는 줄 알았는데,
   3번째 등장하고 난 뒤에는 카운트를 초기화 한 후,
   다시 세어서 또 3번째로 등장하면 다음 문자와 같은지 비교해야 한다는 것
   (나만 문제를 이렇게 해석한건지 모르겠지만 헷갈렸다)
- 문제에 들어있는 예제 'HELLOTHEREEWELLLBEFINEE'를 해석한 후 알아냈고 맞출 수 있었다
- 각 문자를 카운팅하는 배열을 만들고, 카운트가 3이되면, 다음 문자와 현재 문자가 같은지 비교한다
- 다를 경우 fake, 같다면 초기화 하고 다시 카운트한다
 
코드 :

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int t, arr[30];
    string s;
    bool res; //어떤 정답을 출력할지 알려줄 변수

    cin >> t;
    while(t--){
        res = true; //while문 돌 때마다 초기화
        for(int i=0; i<28; i++){ //배열도 초기화 해준다
            arr[i] = 0;
        }
        cin >> s;
        for(int i=0; i<s.size(); i++){
            arr[s[i]-'A']++; //문자에서 'A'를 빼서 해당 인덱스에 카운트해준다
            if(arr[s[i]-'A'] == 3){ //카운트가 3이라면 
                if((i+1 == s.size()) || (i+1 < s.size() && s[i] != s[i+1])){ 
                    res = false; //i+1이 문자열의 사이즈라는 것은 현재의 문자가 늘어나지 않았다는 것
                    break; //사이즈는 괜찮아도 현재 문자와 다음 문자가 다르다는 것 또한 가짜메시지
                }else{ //위의 조건을 패스했다면 -1로 초기화하는데, 
                    arr[s[i]-'A'] = -1; //하나 늘어난 문자를 카운트에 포함시키지 말아야 하기 때문
                }
            }
        }
        (res ? cout << "OK\n" : cout << "FAKE\n");
    }
}