Post
염색체(백준 9342번) | Gihun Son

염색체(백준 9342번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가?

  2. 1시간이내로 풀렸던 문제인가?✓

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?


난이도 체감

  1. 최상

  2. 중✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

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

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

문자열이 주어졌을 때, 위의 규칙을 만족하는지 구하는 프로그램을 작성하시오.

Untitled

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
T=int(input())
st={'A', 'B', 'C', 'D', 'E', 'F'}
for _ in range(T):
    I=sys.stdin.readline().strip()
    start=0
    if I[0]!='A' and I[0] in st:
        start+=1
    elif I[0]!='A' and I[0] not in st:
        print('Good')
        continue
    pre_start=start
    for condition in ['A','F','C']:
        while len(I)>start and I[start]==condition:
            start+=1
        if start-pre_start==0:
            print('Good')
            break
        pre_start=start
    else:
        if start==len(I):
            print('Infected!')
        elif len(I)-start>1 or I[start] not in st:
            print('Good')

정규 표현식을 이용한 다른 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sys import stdin
input = stdin.readline
import re

# A/B/C/D/E/F -> F -> C -> A/B/C/D/E/F
def validate(string):
    rule = re.compile("^[A-F]?A+F+C+[A-F]?$")
    result = rule.match(string)
    return result

if __name__ == "__main__":
    T = int(input())
    for _ in range(T):
        string = input()
        print("Good" if validate(string) == None else "Infected!")

출처: https://s0n9h2.tistory.com/186

정규표현식 공부를 해놓으면 좋을 것 같다.

  • 아래 링크에 잘 정리되어 있음

https://nachwon.github.io/regular-expressions/

This post is licensed under CC BY 4.0 by the author.