12919-g5 성공
This commit is contained in:
80
workbook_8708/gold/12919-g5.py
Normal file
80
workbook_8708/gold/12919-g5.py
Normal 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 진행하면 그냥 모든 조건을 맞출 수 있었다.
|
||||
"""
|
||||
Reference in New Issue
Block a user