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");
        }
    }
}