본문 바로가기

Algorithm/String

(C++) - 백준(BOJ) 9324 : 진짜 메시지

반응형

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

 

9324번: 진짜 메시지

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

www.acmicpc.net

간단한 문자열 이용 구현문제였습니다.

📕 풀이방법

📔 입력 및 초기화

test case수 t, 나온 문자를 확인할 일차원배열 ck, 받은 message msg, 원래 message originMsg를 선언 후 적절히 입력받습니다.

📔 풀이과정

원래 message를 역추적해야합니다.

전달받은 message는 algorithm이 적용된 결과물로 msg에 저장되어 있습니다. 하지만 우리는 이것을 원문처럼 생각할 수 있습니다. 매 3번째나온 문자마다 다음문자를 skip하면 됩니다. 이 문자열의 길이만큼 for loop를 수행합니다.

1. 매 loop마다 originMsg에 msg의 문자를 하나씩 더합니다.

2. 만약 현재보는 문자가 ck배열을 확인했을 때 3번 째 나왔다면 그 문자를 originMsg에 한 번 더해줍니다. 그 후 문자에 해당하는 ck의 index에 접근해 값을 0으로 저장하고 문자 하나를 skip해줍니다. 

📔 정답출력

1. originMsg가 msg와 같다면 algorithm을 적용한 유효 문자열이 전달받은 문자열과 같으므로 진짜입니다.

2. 아니면 가짜입니다.

조건에 맞춰 정답을 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;

int t, ck[26];
string msg, originMsg;

int main(){
    cin >> t;
    while(t--){
        memset(ck, 0, sizeof(ck));
        originMsg = "";

        cin >> msg;

        for(int i = 0; i < msg.size(); i++){
            ck[msg[i]-'A']++;
            originMsg += msg[i];
            if(ck[msg[i]-'A'] == 3){
                originMsg += msg[i];
                ck[msg[i]-'A'] = 0;
                i++;
            }
        }

        if(originMsg == msg) cout << "OK\n";
        else cout << "FAKE\n";
    }
}