문제
스파이들은 사령부와 통신하기 위해서 SMTP(비밀 메시지 전송 프로토콜)를 사용해 비밀 회선으로 전자 메시지를 보낸다. 메시지가 적들에 의해 조작되어 보내진 것이 아닌 진짜 메시지라는 것을 표시하기 위해 모든 메시지는 회선에 노이즈가 있었거나 발신 측에서 손을 떨면서 메시지를 보낸 것처럼 변형되는데, 이 변형 알고리즘은 메시지를 가로채는 자들이 우연히 변형 규칙을 흉내 낼 수 없을 정도로 정교하다. 또한 요원들의 머리에 총구가 겨눠져 강제로 메시지를 말한 경우 간단히 실수를 의도적으로 넣어 이 메시지가 강제로 쓰인 메시지라는 것을 알려줄 수 있다.
알고리즘대로 정확하게 변형된 메시지는 각 문자가 세 번째 등장할 때 한 번 더 문자가 삽입된다. 예를 들면 요원이 "HELLOTHEREWELLBEFINE" 라는 메시지를 보내고 싶어 했다면 "HELLOTHEREEWELLLBEFINEE" 는 정확한 변형이다. 몇 년 동안 이 메시지들의 진짜 여부는 고도로 훈련된 원숭이들이 판별해내었다. 그러나 사령부에 도착하는 메시지들의 양이 많이 늘어나면서 이 작업을 자동으로 처리해주는 프로그램을 고안하기로 하였다.
입력
첫째 줄에 100 이하의 테스트 케이스의 개수가 주어진다. 그리고 각 테스트 케이스마다
- 대문자로만 이루어진 10만자 이하의 문자열 M이 한 줄에 주어진다. 이 문자열은 검사해야할 메시지다.
출력
테스트 케이스마다
- 메시지 M이 진짜 메시지면 “OK”를, 가짜 메시지면 “FAKE”를 한 줄에 출력한다.
Solved.ac 레벨
실버 V
풀이
#include <bits/stdc++.h>
using namespace std;
int t;
int alphabet[26];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> t;
while(t--){
string str;
bool flag = true;
cin >> str;
for(int i = 0; i < str.length(); i++){
alphabet[str[i] - 'A']++; //해당 알파벳의 개수 증가
if(alphabet[str[i] - 'A'] == 3){
if(str[i] == str[i+1] && i + 1 < str.length()){
i++; //다음 인덱스의 문자가 현재 인덱스와 같고 문자열 범위 안에 있다면 skip.
alphabet[str[i] - 'A'] = 0;
} else{
flag = false;
}
}
}
memset(alphabet, 0, sizeof(alphabet)); //다음 테스트케이스를 위해 배열 초기화.
if(flag) cout << "OK\n";
else cout << "FAKE\n";
}
return 0;
}
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 26082번 : WARBOY (0) | 2022.11.30 |
---|---|
[BOJ / C++] 25592번 : 바둑돌 게임 (0) | 2022.11.30 |
[BOJ / C++] 10797번 : 10부제 (0) | 2022.11.27 |
[BOJ / C++] 20492번 : 세금 (0) | 2022.11.25 |
[BOJ / C++] 16170번 : 오늘의 날짜는? (0) | 2022.11.23 |