두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 두 가지 연산만 가능하다.
1. 문자열 뒤에 A를 추가한다. 2. 문자열을 뒤집고 뒤에 B를 추가한다. S를 T로 만들 수 있는지 확인하는 프로그램을 만드시오.
규칙을 생각한 후 일반화하려고 한다. S와 T를 비교했을 때, 다음문자에 따라 어떤 연산을 할 지 결정할 수 있었다. 그런데 이렇게 했더니 앞의 문자가 계속 바뀌니 변수가 너무 많았다. 복잡쓰
아?! 전에 A->B 문제 풀었을 때처럼 반대로 가보자.
T->S
로 가는 걸 생각해보니 두 가지 연산 모두 뒤에 문자를 제거하고 시작한다는 공통점이 있었다. 코드가 한결 간단해졌다. 앞의 문자를 신경쓰지 않고 무조건 모두 뒤집으면 된다. 왜틀렸지?
import sys
input = sys.stdin.readline
S = input().strip()
T = input().strip()
cur_str = T
length = len(T) - len(S)
for _ in range(length):
if cur_str[-1] == "A":
cur_str = cur_str[:-1]
else:
cur_str = cur_str[:-1]
temp = ""
for i in range(len(cur_str)):
if cur_str[i] == "A":
temp += "B"
else:
temp += "A"
cur_str = temp
if cur_str == S:
print(1)
else:
print(0)
코드를 잘못 짠 게 아니라 문자열을 뒤집고 B를 추가한다
라는 연산에서 문자열을 뒤집는다는 표현을 잘못 이해했다. A->B, B->A 로 변환하는 게 아니라 그냥 앞뒤로 순서를 뒤집는 거였다.(요즘 문제이해 실수가 잦다;;;;;;) 오.....마이갓....바로 맞아버렸죠?
문자열을 하나씩 다루는 경우 문자열로 저장하지 않고 문자열을 1개씩 나눠담은 리스트로 저장하는 게 처리하기 편할 때도 있으니 염두해두자 !!!
import sys
input = sys.stdin.readline
S = list(input().strip())
T = list(input().strip())
flag = False
while T:
if T[-1] == "A":
T.pop()
elif T[-1] == "B":
T.pop()
T.reverse()
if S == T:
flag = True
break
if flag:
print(1)
else:
print(0)