본문 바로가기
Algorithms/백준

[백준_12904]A와 B with Python

by jeomn 2021. 6. 30.

백준(BOJ) 문자열 문제집: A와 B(골드 5)

문제 출처: https://www.acmicpc.net/problem/12904

 

12904번: A와 B

수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수

www.acmicpc.net

1. 알고리즘

약간....이렇게 생각할 수 있구나!했던 문제

지금까지 '규칙이 있어. 이 규칙을 사용해서 A로 B를 만들 수 있는지 알아내라' 했던 문제는 완전 탐색(브루트포스)으로 A로 만들 수 있는 경우의 수를 구하고, 그 안에 B가 있는지를 확인하는 방법으로 풀었었다...그런데 반대로 생각하면 아주 간단하다는 걸 알게 되었다...!

규칙을 거꾸로 적용해서 B로 A를 만들 수 있는 지 확인하면 된다는 것...아주 간단하다. 이 문제의 경우 문자열의 맨 뒤에 문자를 추가하는 규칙이기 때문에, 문자열의 맨 뒤 문자를 확인해서 규칙을 역으로 적용해주기만 하면 된다. 

  • 연산한 T문자열의 길이가 S문자열의 길이와 같을 때까지 반복
    • 문제에서 주어진 연산의 역연산을 적용
      • 문자열의 맨 뒤가 'A'이면, 'A' 제거
      • 문자열의 맨 뒤가 'B'이면, 'B' 제거 후 문자열 뒤집기
  • 연산한 T문자열과 S문자열이 같으면 '1', 같지 않으면 '0' 출력

 

2. 유의 사항

 

3. 어려웠던 점, 해결방법

 

4. 소스코드

상세 설명은 주석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
 
 
input_func = sys.stdin.readline
if __name__ == '__main__':
    S = str(*map(str, input_func().split()))
    T = str(*map(str, input_func().split()))
 
    temp_string = T
    while len(S) != len(temp_string):       #T연산 문자열이 S와 동일한 길이가 될 때까지 반복
        #'A'추가 연산의 역연산
        #문자열 맨 뒤가 'A'이면 'A' 제거
        if temp_string[-1== 'A':
            temp_string = temp_string[:-1]
        
        #'B'추가 연산의 역연산
        #문자열 맨 뒤가 'B'이면 'B' 제거 후 문자열 뒤집기
        elif temp_string[-1== 'B':
            temp_string = temp_string[:-1]
            temp_string = temp_string[::-1]
    
    #T연산 문자열과 S문자열이 같으면 '1', 같지 않으면 '0' 출력
    print('1' if temp_string == S else '0')
cs

 

5. 고민

댓글