백준 9342. 염색체
문자열, 정규표현식 문제
1. 간단 설명
문자열이 주어지고
모든 조건을 만족한다면 “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]?$
라는 정규표현식을 뜯어보면
[A-F]?
- A~F 사이의 하나가 올 수 도 있고, 안올수도 있다(
?
)
- A~F 사이의 하나가 올 수 도 있고, 안올수도 있다(
A+
- 반드시 하나 이상의 A가 연속해서 나와야 한다
F+
- 반드시 하나 이상의 F가 연속해서 나와야 한다
C+
- 반드시 하나 이상의 C가 연속해서 나와야 한다
[A-F]?$
- 문자열 끝(
$
)에 A~F 사이의 문자 하나가 올수도 있고, 안올수도 있다(?
)
- 문자열 끝(
정규표현식을 알아야 풀 수 있는 문제라고 생각한다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.