포스트

백준 9342. 염색체

염색체

문자열, 정규표현식 문제

1. 간단 설명


image

문자열이 주어지고

모든 조건을 만족한다면 “Infected!”를,

하나라도 틀린다면 “Good”을 출력하는 문제

주요 규칙은 다음과 같다

1
2
3
4
5
1. 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
2. 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
3. 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
4. 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
5. 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.

2. 예시


조건이 이해가 잘 가지 않아 엄청 헤맸다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
15
AFC -> 모든 조건을 만족하므로 Infected!
AAFC -> 마찬가지
AAAFFCC
AAFCC
BAFC
QWEDFGHJMNB -> 
DFAFCB
ABCDEFC
DADC
SDFGHJKLQWERTYU
AAAAAAAAAAAAABBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEEEEEEFFFFFFFFC
AAAFFFFFBBBBCCCAAAFFFF
ABCDEFAAAFFFCCCABCDEF
AFCP
AAFFCPP

3. 알고리즘


직접 문자열을 비교하는 방식으로 구현했으나

특히 첫번째 조건이 잘 이해가 가지않아서 결국 실패함

{A, B, C, D, E, F} 중 0개 또는 1개로 시작해야한다

이 중 하나로 시작해야하는것도 아니고, 0개 또는 1개로 시작해야하는건 무슨 말인가 한참 고민했다

0개로 시작한다는건 ZAA~처럼 결국 아무 알파벳이나 시작해도 상관 없는거 아닌가? 라고 생각했는데

{A, B, C, D, E, F} 중 1개로 시작한다 라는 뜻은

AFFFCC, BFFFFCC, CFAACC 처럼 이 배열 중 하나로 시작하는 경우를 말하고

{A, B, C, D, E, F} 중 0개로 시작한다 라는 뜻은

AAFFC, AFFC, AFFFFCC 처럼 첫글자를 생략하고 바로 두번째 조건으로 이어진다는 것을 뜻한다

즉 문자열이 바로 규칙 2부터 시작할 수 있다는 말이였다

2규칙이 그 다음에는 A가 하나 또는 그 이상 있어야 한다. 이므로, {A, B, C, D, E, F} 중 한글자가 없다면 바로 A가 나와야한다

4. 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <regex>

using namespace std;

int main() {
	// freopen_s(new FILE*, "input.txt", "r", stdin);

	regex pattern("[A-F]?A+F+C+[A-F]?$");

	int T;
	cin >> T;
	while (T--) {
		string str; cin >> str;
		if (regex_match(str, pattern))
			cout << "Infected!" << '\n';
		else
			cout << "Good" << '\n';
	}

	return 0;
}

정규표현식을 이용한 풀이를 보고, 내가 작성한 풀이는 의미 없을것 같아서 이것만 올림

[A-F]?A+F+C+[A-F]?$ 라는 정규표현식을 뜯어보면

  1. [A-F]?
    • A~F 사이의 하나가 올 수 도 있고, 안올수도 있다(?)
  2. A+
    • 반드시 하나 이상의 A가 연속해서 나와야 한다
  3. F+
    • 반드시 하나 이상의 F가 연속해서 나와야 한다
  4. C+
    • 반드시 하나 이상의 C가 연속해서 나와야 한다
  5. [A-F]?$
    • 문자열 끝($)에 A~F 사이의 문자 하나가 올수도 있고, 안올수도 있다(?)

정규표현식을 알아야 풀 수 있는 문제라고 생각한다

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.