백준(BOJ) 3300 무어 기계 파이썬(Python)

문제 링크

정규표현식을 이용하는 무어 기계 문제.
정규표현식으로 주어진 무어 기계를 나타내고, 빈 심볼을 결정할 수 있는지 확인하는 문제이다.
단순히 하나의 정규식만을 이용하는 경우 풀기가 어려워지고, 여러 경우의 수를 생각할 필요가 있다.
먼저, 매칭이 아예 되지 않는 경우이다. 이 경우 출력은 !가 된다(ex. A_AAA).
그 다음은, 지워진 심볼을 사용하지 않고 매칭이 되는 경우이다. 이 경우 출력은 _가 된다(ex. A(B|_)AABA).
다음으로, 지워진 심볼을 사용해야만 매칭이 되면서, 가능한 경우의 수가 한 가지인 경우이다. 이 경우 출력은 해당 심볼이 된다(ex. A_AAAA).
마지막으로, 지워진 심볼을 사용해야만 매칭이 되지만, 가능한 경우의 수가 여러가지라 빈 심볼을 결정하지 못하는 경우이다. 이 경우 출력은 _가 된다(ex. (A|AB)_(AB|B)ABAB).
이 경우를 각각 고려해서 알맞은 심볼을 출력하면 된다.

#!python

from sys import stdin
import re

input = stdin.readline

t = int(input())

for _ in range(t):
    # 원래의 무어 머신
    machine = input().rstrip()
    # 지워진 심볼을 사용하지 않고 매칭하는 경우
    machine_r = re.sub(r'(\|_|_\|)', '', machine)
    # 지워진 심볼을 사용하고 매칭되는 경우
    machine_q = machine.replace('_', '(?P<char>.)')
    text = input().rstrip()
    mat_r = re.fullmatch(machine_r, text)
    mat_q = re.fullmatch(machine_q, text)
    if mat_r is None and mat_q is None:
        # 만약 매칭이 아예 안 된다면
        print('!')
    elif mat_r is None:
        # 만약 지워진 심볼이 없으면 매칭이 안 된다면
        char = mat_q.group('char')
        # 지워진 심볼의 경우의 수가 여러가지인 경우
        machine_a = machine.replace('_', f'(?P<char>[^{char}])')
        mat_a = re.fullmatch(machine_a, text)
        if mat_a is None:
            # 만약 지워진 심볼의 경우의 수가 하나라면
            print(mat_q.group('char'))
        else:
            # 만약 지워진 심볼의 경우의 수가 여러가지라면
            print('_')
    else:
        # 만약 지워진 심볼이 없이도 매칭이 된다면
        print('_')

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑