PS_Baekjoon
[백준 C++] 9342번 : 염색체
SMILELY
2023. 3. 30. 10:46
https://www.acmicpc.net/problem/9342
9342번: 염색체
상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다. 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다. 상근이는 각 염색체가 다음과 같은 규칙
www.acmicpc.net
풀이 :
- 주어진 문자열이 문제에서 요구하는 패턴에 만족하는지 검사해야 한다
- 여러 문자가 연속해서 들어올 수도 있기 때문에 해당 문자의 등장여부를 체크한 뒤,
등장하지 않았을 때만 스택에 넣어줌으로 중복을 제거하고, 순서는 지키면서 문자열을 최소한으로 줄일 수 있다
- 이렇게 중복을 제거하고 스택에 넣어줬다면 고려할 대상은 문자열 0인덱스부터 4인덱스까지다
- 각 인덱스가 조건에 부합하는지 체크해줌으로 문제를 해결 할 수 있다
코드 :
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
int t;
vector<char>v; //중복을 제거한 새 문자열을 넣어줄 배열
string s;
bool res; //어떤 정답을 출력할지 알려줄 변수
cin >> t;
while(t--){
v.clear(); //매 테스트 케이스마다 초기화
bool arr[30] = {0, }; //한번에 초기화하기 위해 while문 안에 선언
res = true; //조건에 걸리지 않는다면 정답은 true값
cin >> s;
if(s.size() < 3){ //조건에 부합하는 최소 길이는 3
cout << "Good\n";
}else{
for(int i=0; i<s.size(); i++){
if(!arr[s[i]-'A']){ //처음 등장하는 문자라면
v.push_back(s[i]); //배열에 넣어준다
}
arr[s[i]-'A'] = true; //등장 여부 처리
}
if(v[0] > 'F'){ //첫번째 조건 검토
res = false;
}else{
if(v[0] != 'A'){ //첫번째 조건 - 첫 문자가 B~F인 경우
if(v[1] == 'A' && v[2] == 'F' && v[3] == 'C'){ //2,3,4 조건에 부합한다면
if((v.size() > 5) || v.size() == 5 && v[4] > 'F'){ //마지막 조건 검토
res = false; // 사이즈가 5이상이라면 문자가 더 있는 것이고, 사이즈가 5면서 F이상이라면
} //조건에 부합하지 않는다. 사이즈가 5일때라는 조건이 없으면 세그 폴트가 뜰 수 있어 조건을 넣어줘야 한다
}else{ //2,3,4 조건에 부합하지 않는 경우
res = false;
}
}else{ //첫 문자가 A인 경우 첫번째 조건을 고려하지 않아도 됨
if(v[0] == 'A' && v[1] == 'F' && v[2] == 'C'){
if((v.size() > 4) || (v.size() == 4 && v[3] > 'F')){
res = false;
}
}else{
res = false;
}
}
}
(res ? cout << "Infected!\n" : cout << "Good\n");
}
}
}