diff --git a/workbook_8708/gold/12919-g5.py b/workbook_8708/gold/12919-g5.py new file mode 100644 index 0000000..231c129 --- /dev/null +++ b/workbook_8708/gold/12919-g5.py @@ -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 진행하면 그냥 모든 조건을 맞출 수 있었다. +""" \ No newline at end of file