이번 문제는 백준 16953번 문제와 거의 똑같은 문제입니다. 그럼 살펴볼까요?
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.
이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.
주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 999, 2 ≤ T의 길이 ≤ 1000, S의 길이 < T의 길이)
출력
S를 T로 바꿀 수 있으면 1을 없으면 0을 출력한다.
예제 입력 1 복사
B
ABBA
예제 출력 1 복사
1
예제 입력 2 복사
AB
ABB
예제 출력 2 복사
0
두 문자열 S와 T가 주어졌을 때, S를 T로 바꿀 수 있으면 1, 없으면 0을 출력하는 문제입니다.
문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능합니다:
입출력을 살펴보도록 하겠습니다.
문자열 S에서 T로 바꾸는데 두 가지 방법이 있습니다. 그런데 S에서 T로 갈 때마다 두 가지 방법이 있다는 것은 만큼의 반복이 일어날 수 있습니다. 여기서 N은 반복 횟수입닏.
왜냐하면 매 문자열마다 두 가지 방법이 있기 때문이죠. 따라서 S에서 T로 가는 경우는 매우 복잡합니다.
그렇기 때문에 저는 T에서 S로 생각을 해보았습니다.
그렇다면, 문자열 맨뒤에 A가 있다면? → A를 제거합니다.
문자열 맨뒤에 B가 있다면? → B를 제거하고 뒤집습니다.
즉, S → T로 갈 때 하는 연산을 거꾸로 생각하면 되는것입니다.
이번 문제는 바로 코드 구현을 해보도록 하겠습니다.
import sys
S = sys.stdin.readline().strip()
T = sys.stdin.readline().strip()
flag = False
while T:
if T[-1] == 'A':
T = T[:-1]
elif T[-1] == 'B':
T = T[:-1]
T = T[::-1]
if S == T:
flag = True
break
print(1 if flag else 0)
이번 문제는 골드 레벨의 문제였지만, 방법만 생각해낸다면 비교적 쉬운 문제였습니다.
이렇게 문제를 잘 파악하는 것이 그리디 알고리즘의 특징이란 것을 다시 한 번 깨닫게 되었습니다.
글 읽어주셔서 감사합니다.