본문 바로가기

algorithm/BOJ

백준 9342_염색체(C++)

 

www.acmicpc.net/problem/9342

 

9342번: 염색체

상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다. 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다. 상근이는 각 염색체가 다음과 같은 규칙

www.acmicpc.net

[문제 풀이]

구현을 이용하여 문제를 풀었습니다.

 

이 문제는 아래의 조건을 만족해야 합니다.

  • 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
  • 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
  • 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
  • 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
  • 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 끝나야 한다.

따라서, 아래와 같은 조건을 검사하는 형태로 코드를 구현하였습니다.

  • 문자의 처음과 끝에 등장하는 문자가 {A, B, C, D, E, F} 중 1개 이상 포함하지 않으면 Good을 출력합니다.
  • 위의 조건을 통과할 경우 앞뒤의 문자가 같은지를 비교합니다.
  • 다른 경우 전 문자가 A, F, C 문자인가를 확인하고 문자열 처리를 해줍니다.
  • 위의 조건을 만족하지 못한다면 Good을 출력하고 만족한다면 infected! 를 출력합니다.

[코드]

#include<iostream>
#include<string>

using namespace std;

int T;

int main() {

	cin >> T;

	for (int i = 0; i < T; i++) {
		string str;
		cin >> str;

		int L = str.size();

		bool check = false;

		if (str.at(0) == 'A' || str.at(0) == 'B' || str.at(0) == 'C' || str.at(0) == 'D' || str.at(0) == 'E' || str.at(0) == 'F')
			check = true;
		
		if (!check) {
			cout << "Good" << endl;
			continue;
		}

		check = false;

		if (str.at(L - 1) == 'A' || str.at(L - 1) == 'B' || str.at(L - 1) == 'C' || str.at(L - 1) == 'D' || str.at(L - 1) == 'E' || str.at(L - 1) == 'F')
			check = true;

		if (!check) {
			cout << "Good" << endl;
			continue;
		}

		char temp = 'S';

		for (int j = 1; j < str.size() - 1; j++) {
			
			if (str.at(j - 1) != str.at(j)) {

				if (str.at(j - 1) == 'B' || str.at(j - 1) == 'D' || str.at(j - 1) == 'E') {

					if (temp == 'S' && str.at(j) == 'A') {
						temp = 'A';
					}
					else {
						check = false;
						cout << "Good" << endl;
						break;
					}

				}else if (str.at(j - 1) == 'A') {

					if ((temp == 'S' || temp == 'A') && str.at(j) == 'F') {
						temp = 'F';
					}
					else {
						check = false;
						cout << "Good" << endl;
						break;
					}

				}
				else if (str.at(j - 1) == 'F') {

					if (temp == 'F' && str.at(j) == 'C') {
						temp = 'C';
					}
					else {
						check = false;
						cout << "Good" << endl;
						break;
					}

				}
				else if (str.at(j - 1) == 'C') {

					if (temp == 'C' && (str.at(j) == 'A' || str.at(j) == 'B' || str.at(j) == 'C' || str.at(j) == 'D' || str.at(j) == 'E' || str.at(j) == 'F')) {
					}
					else {
						check = false;
						cout << "Good" << endl;
						break;
					}

				}
				else {
					check = false;
					cout << "Good" << endl;
					break;
				}
			}
		}

		if (check)
			cout << "Infected!" << endl;

	}

	return 0;

}

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 16395_파스칼의 삼각형(C++)  (0) 2020.10.23
백준 1260_DFS와 BFS(C++)  (0) 2020.10.21
백준 1927_최소 힙(C++)  (0) 2020.10.18
백준 11279_최대 힙(C++)  (0) 2020.10.18
백준 10845_큐(C++)  (0) 2020.10.17