https://www.acmicpc.net/problem/12904
12904번: A와 B
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수
www.acmicpc.net
https://github.com/stellaluminary/Baekjoon
GitHub - stellaluminary/Baekjoon
Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.
github.com
s에 대하여 하나씩 추가하는 방향으로 진행했을 때 트리적으로 증가하고 이에 따라 시간 초과가 발생한다.
s = input()
t = input()
res = [s]
for i in range(len(t) - len(s)):
tmp = []
for j in range(len(res)):
a = res[j] + 'A'
b = res[j][::-1] + 'B'
if len(a) == len(t):
if a == t:
tmp.append(a)
if b == t:
tmp.append(b)
break
if a in t or a[::-1] in t:
tmp.append(a)
if b in t or b[::-1] in t:
tmp.append(b)
res = tmp[:]
if len(res):
print(1)
else:
print(0)
방법 1에서는 하나씩 추가하는 방법을 채택했다면 본 방법은 하나씩 제거하는 방향으로 체크하는 것이다.
당연한 이야기겠지만 방법 1은 $2^n$으로 증가하는 반면 소거법은 빠르게 제거하므로 더 빠르고 메모리도 적게 사용한다.
s = input()
t = input()
res = 0
flag = False
while len(t) > len(s):
if t[-1] == 'A':
t = t[:-1]
elif t[-1] == 'B':
t = t[:-1]
t = t[::-1]
if s == t:
flag = True
break
if flag:
print(1)
else:
print(0)