#include <iostream>
#include <vector>
using namespace std;
int T, N;
vector<int> R;
vector<int> Y;
vector<int> B;
string P;
int main(){
ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin >> T;
for(int i = 1; i <= T; i++){
int cnt = 0;
R.clear(); Y.clear(); B.clear(); // 벡터 지우기
bool flag; // true면 현재 1
cin >> N >> P;
for(int j = 0; j < N; j++){
// 1이 있으면 해당 색의 칠이 필요한 것
if(P[j] == 'U'){
R.push_back(0);
Y.push_back(0);
B.push_back(0);
} else if(P[j] == 'R'){
R.push_back(1);
Y.push_back(0);
B.push_back(0);
} else if(P[j] == 'Y'){
R.push_back(0);
Y.push_back(1);
B.push_back(0);
} else if(P[j] == 'B'){
R.push_back(0);
Y.push_back(0);
B.push_back(1);
} else if(P[j] == 'O'){
R.push_back(1);
Y.push_back(1);
B.push_back(0);
} else if(P[j] == 'P'){
R.push_back(1);
Y.push_back(0);
B.push_back(1);
} else if(P[j] == 'G'){
R.push_back(0);
Y.push_back(1);
B.push_back(1);
} else if(P[j] == 'A'){
R.push_back(1);
Y.push_back(1);
B.push_back(1);
}
}
// for(int j = 0; j < N; j++){
// printf("%d ", Y[j]);
// }
// printf("\n");
// for(int j = 0; j < N; j++){
// printf("%d ", B[j]);
// }
if(R[0] == 1){
flag = true;
cnt++;
} else {
flag = false;
}
for(int j = 0; j < N; j++){
if(R[j] == 0 && flag){
flag = false;
} else if(R[j] == 1 && !flag){
flag = true;
cnt++;
}
}
if(Y[0] == 1){
flag = true;
cnt++;
} else {
flag = false;
}
for(int j = 0; j < N; j++){
if(Y[j] == 0 && flag){
flag = false;
} else if(Y[j] == 1 && !flag){
flag = true;
cnt++;
}
}
if(B[0] == 1){
flag = true;
cnt++;
} else {
flag = false;
}
for(int j = 0; j < N; j++){
if(B[j] == 0 && flag){
flag = false;
} else if(B[j] == 1 && !flag){
flag = true;
cnt++;
}
}
printf("Case #%d: %d\n", i, cnt);
}
return 0;
}
배열을 이용해서 푼 문제.
채색을 해 나가는데 무조건 이어지게 채색을 해야한다.
말로 설명하기 힘들어서 풀이를 위해 끼적인 것 첨부
색은 RYB로 이루어지며 모든 경우의 수에 따라 해당 색이 필요한 경우(칠해진 경우)를 배열에 담는다.
동적 배열을 사용하여 메모리 사용을 아끼기 위해 vector를 이용하였다.
그리고 1이 이어진 경우 +1을 하기 위해 flag를 사용해서 1의 연속성 여부를 검사하여 카운트 해주었다.