A와 B로만 이뤄진 문자열 s, t가 주어질 때,
두 가지 연산을 통해 s → t로 변환할 수 있을까?
가능하면 1, 아니면 0을 출력하라.두 가지 연산
1. 뒤에 A를 추가
2. 문자열을 뒤집고, 뒤에 B를 추가
Time limit | Memory limit |
---|---|
2 sec | 512 MB |
거꾸로 t→s로 만들어보자!
t
를 넣는다.rev
를 만든다.que
가 비어있지 않는 동안 다음 4-6 과정을 반복한다.rev
값을 확인해서 현재 문자열이 s
와 같은지 확인한다.rev == True
면서 현재 문자열 == s
라면 True
를 리턴한다.rev == False
면서 현재 문자열 == reversed(s)
라면 True
를 리턴한다.rev
값을 확인해서 비교할 문자를 정한다.rev == True
면 맨 앞 값을 pop한다. (popleft())rev == False
면 맨 뒤 값을 pop한다. (pop())B
면 rev
를 뒤집어준다.A와 B로만 이뤄진 문자열 s, t가 주어질 때,
두 가지 연산을 통해 s → t로 변환할 수 있을까?
가능하면 1, 아니면 0을 출력하라.두 가지 연산
1. 뒤에 A를 추가
2. 문자열을 뒤집고, 뒤에 B를 추가
Time limit | Memory limit |
---|---|
2 sec | 512 MB |
거꾸로 t→s로 만들어보자!
- 문자열의 왼쪽은 B를 pop하고 오른쪽은 A를 pop해 값을 비교한다.
- 비교한 후의 문자열도 다시 que에 넣는다.
t
를 넣는다. 그리고 que
에 해당 deque를 넣는다.que
가 비어있지 않는 동안 다음 3-5 과정을 반복한다.que
를 pop해서 deque를 얻어 cur
변수에 넣고 다음을 체크한다.cur
가 비어있다면 다음으로 넘어가고cur의 문자열 == s
면 True
를 리턴한다.cur
의 맨 앞 값이 B
라면 해당 값을 pop한 후 que
에 넣는다. (popleft())cur
의 맨 뒤 값이 A
라면 해당 값을 pop한 후 que
에 넣는다. (pop())⚠️ 4, 5번에서 주의할 점
→ cur를 pop하고 복구도 해야하면서, cur 자체를 매개변수로 넘기지 않아야 한다.
(또다른 방법으로는 dfs를 재귀적으로 사용하는 것도 가능할 것이다.)
(사실 시간 복잡도를 고려하지 않는다면, 굳이 pop을 하고 복구하고 복사하는 과정을 생략해도 될 것이다.)
# BOJ 12904 A와 B
# A와 B로만 이뤄진 문자열;
# S를 T로 바꿀 수 있으면 1 없으면 0을 출력
# 가능한 2가지 연산: 뒤에 A추가 or 뒤집고 뒤에 B추가
# input
s = input() # 999
t = input() # 999
# solution
from collections import deque
class Solution:
def canChange(s, t):
rev = False
que = deque(t)
while que:
cur_str = "".join(que)
# rev 확인해서 값 비교 주의
if not rev and cur_str == s:
return True
elif rev and cur_str == s[::-1]:
return True
c = que.popleft() if rev else que.pop()
if c == 'B':
rev = not rev
return False
# output
ans = 1 if Solution.canChange(s, t) else 0
print(ans)
# BOJ 12919 A와 B 2
# A와 B로만 이뤄진 문자열;
# S를 T로 바꿀 수 있으면 1 없으면 0을 출력
# 가능한 2가지 연산: 뒤에 A추가 or "뒤에 B추가 후 뒤집기"
# input
s = input() # 49
t = input() # 50
# solution
from collections import deque
import time
class Solution:
def canChange(s, t):
que = [deque(t)]
while que: # Lt - Ls # 50
cur = que.pop()
if not cur:
continue
if "".join(cur) == s:
return True
if cur[0] == 'B':
cur.popleft()
que.append(deque(reversed(cur))) # 50
cur.appendleft('B')
if cur[-1] == 'A':
cur.pop()
que.append(cur.copy()) # 50 # 주의 Call by assignment
cur.append('A') # X
return False
# output
ans = 1 if Solution.canChange(s, t) else 0
print(ans)