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");
}
}
'PS_Baekjoon' 카테고리의 다른 글
[백준 C++] 9342번 : 염색체 (0) | 2023.03.30 |
---|---|
[백준 C++] 17413번 : 단어 뒤집기 2 (0) | 2023.03.29 |
[백준 C++] 12789번 : 도키도키 간식드리미 (0) | 2023.03.27 |
[백준 C++] 11899번 : 괄호 끼워넣기 (0) | 2023.03.26 |
[백준 C++] 20365번 : 블로그2 (0) | 2023.03.25 |