12919-g5 성공

This commit is contained in:
2026-02-27 10:42:26 +09:00
parent edb54cb0a4
commit 633ec60c73

View File

@@ -0,0 +1,80 @@
# A와 B 2
import sys
from collections import deque
input = sys.stdin.readline
def check_same(dq, start, lst_s):
if start == -1:
dq = list(reversed(dq))
for i in range(len(dq)):
if dq[i] != lst_s[i]:
return 0
else:
return 1
def solution():
s = input().rstrip()
t = input().rstrip()
lst_s = list(s)
dq = deque(list(t))
result = []
def bt(now_dq, start, end):
if len(now_dq) == len(lst_s):
result.append(check_same(now_dq, start, lst_s))
return
if now_dq[start] == "A":
if now_dq[end] == "B":
return
else:
tmp = now_dq.pop() if start == 0 else now_dq.popleft()
bt(now_dq, start, end)
now_dq.append(tmp) if start == 0 else now_dq.appendleft(tmp)
elif now_dq[start] == "B":
if now_dq[end] == "A":
tmp = now_dq.pop() if start == 0 else now_dq.popleft()
bt(now_dq, start, end)
now_dq.append(tmp) if start == 0 else now_dq.appendleft(tmp)
start, end = end, start
tmp = now_dq.pop() if start == 0 else now_dq.popleft()
bt(now_dq, start, end)
now_dq.append(tmp) if start == 0 else now_dq.appendleft(tmp)
start, end = 0, -1
bt(dq, start, end)
if 1 in result:
print(1)
else:
print(0)
return
solution()
"""
걸린 시간: 1시간 20분
시간 복잡도: deque는 연결 리스트라서 i번째 원소에 접근 시간이 O(n)이다.(충격적인 사실)
따라서 check_same이 O(n^2)이 될 수 있고, 이대로 bt까지 해버리면 시간복잡도는 어후... 최대 길이가 50이라 살았다.
해설: s에서 t를 가려고 하니 2가지 경우의 수를 49번까지 해야하기 때문에 2^49라서 말이 안된다고 생각했다.
그래서 t에서 s로 가려고 생각하다보니 시작 끝이 A-A, A-B, B-A, B-B에 따라 경우의 수가 많이 없을 것 같다고 생각했다.
각각 현재 상황에 올 수 있는 이전 상황을 세팅해보면,
A-A: 맨 앞이 A였고, A를 붙임(경우 1)
A-B: 있을 수 없는 상황(B를 붙이면 뒤집어야하기 때문 -> 경우 0)
B-B: 맨 앞이 B였고, B를 붙임(경우 1)
B-A: 맨 앞 A였고 B를 붙임 or 맨 앞 B였고, A를 붙임(경우 2)
처음에는 B-A도 경우가 1인줄 알고 단순 구현으로 해봤는데 틀렸다.
알고보니 B-A에서 경우가 2가지였고, 이때부터 백트래킹을 고민하였다.
4가지 상황에 대해 각각 분기해서 bt를 진행하였고, 슬라이싱으로 넘기는 것은 시간복잡도가 자른만큼 생기기 때문에 deque를 이용해서
빼고 bt하고 다시 뺐던거 넣는 방식으로 기존 dq를 유지하면서 bt를 진행했다.
근데 각 상황에 대해 분기처리를 하면 코드 중복이 좀 많이 발생하여 4가지 상황을 자세히 살펴보니
끝이 A일때 pop으로 bt 진행하고, 시작이 B일때 popleft로 bt 진행하면 그냥 모든 조건을 맞출 수 있었다.
"""