백준 12904번 - A와 B

Gyuhan Park·2021년 12월 9일
0

코딩테스트 정복

목록 보기
37/47

두 문자열 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)  
profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글