728x90
시간 제한 2초, 메모리 제한 64MB
# 조건
- 상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다.
- 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다.
- 상근이는 각 염색체가 다음과 같은 규칙을 만족하는지 검사해야 한다.
- 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
- 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.
- 문자열이 주어졌을 때, 위의 규칙을 만족하는지 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 테스트 케이스의 개수 T ≤ 20 이 주어진다.
- 각 테스트 케이스는 한 줄로 이루어져 있으며, 최대 200개의 알파벳 대문자로 이루어진 문자열이 주어진다.
출력
- 각 테스트 케이스에 대해서, 문제의 규칙을 지키는 문자열인 경우에는 "Infected!"를, 아닌 경우에는 "Good"을 출력한다.
# 접근 방법
- 시작과 끝 문자열이 ABCDEF 중에 0개 또는 1개가 있다는 것이, AFCAA와 같이 1개로만 이루어져도 되는지, 아니면 개수도 1개여야 되는지가 애매하다고 생각했다.
- 본인은 개수도 1개여야 된다고 판단하고 코드를 짰지만
- 다만, 테스트 케이스가 빈약해서 어떤 코드를 제출하여도 정답처리가 되었다.
- 주어진 조건을 완전 탐색으로 검사해주어도 시간 초과가 나지 않는다.
- 모든 문자열은 우선 ABCDEF로만 이루어져야 하므로 check 리스트를 만들어 준다.
- 이후, target 문자열을 순회하며 ordered set으로 만들어줄건데 temp의 top이 현재 문자열과 같지 않다면 넣어준다.
- 조심할 점은, 현재 temp의 top이 C이고 순회 중인 문자열이 C가 아닐 때, 남은 문자열의 수가 2개 이상이라면 처음 언급한 것과 같이 규칙을 지키지 못한 것으로 판단했다.
- AFCAA의 경우 2번째 A를 순회할 때, TEMP에는 [A, F, C]가 들어 있고 현재 남은 A가 2개이므로 종료해주었다.
- 모든 순회가 끝났다면, 우선 최대로 나올 수 있는 길이는 [시작 문자열, A, F, C, 마치는 문자열] 5가 되고, 이를 넘어가면 Good을 출력해준다.
- TEMP의 시작 문자열이 CHECK 리스트에 들어있고 A가 아니라면 POP(0)을 해준다.
- 남은 문자열 0~2번 인덱스는 [A, F, C]와 동일해야 하므로 체크해주고
- 마치는 문자열이 CHECK에 있는지 검사해주면 된다.
import sys
input = sys.stdin.readline
T = int(input())
check = ['A', 'B', 'C', 'D', 'E', 'F']
for _ in range(T):
result = 'Infected!'
target = input().strip()
temp = []
for i in range(len(target)):
if not i == 0 and temp[-1] == 'C' and not target[i] == 'C' and len(target) - i >= 2:
result = 'Good'
break
if not temp:
temp.append(target[i])
else:
if not target[i] == temp[-1]:
temp.append(target[i])
if result == 'Good':
print(result)
continue
if len(temp) > 5:
print('Good')
continue
if not temp[0] in check:
print('Good')
continue
if temp[0] != 'A':
temp.pop(0)
val = ['A', 'F', 'C']
if val != temp[0:3]:
result = 'Good'
if not temp[-1] in check:
result = 'Good'
print(result)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 1948번] 파이썬 - 임계경로 (1) | 2023.10.04 |
---|---|
[백준 16564번] 파이썬 - 히오스 프로게이머 (0) | 2023.09.21 |
[백준 19236번] 파이썬 - 청소년 상어 (0) | 2023.09.13 |
[백준 18311번] 파이썬 - 왕복 (0) | 2023.09.12 |
[백준 16926번] 파이썬 - 배열 돌리기1 (0) | 2023.09.08 |