Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준2573
- 전기 요금
- 백준16954
- 로또의 최고 순위와 최저 순위
- 백준
- 백준3190
- 인구 이동
- 124 나라의 숫자
- 파이썬
- Smart Commit
- 백준 2564
- 빙산
- A와 B
- 백준 14499
- 백준1697
- 백준1788
- 단어 수학
- 백준16234
- 키패드 누르기
- 부스트캠프
- 코딩테스트
- 백준12904
- 프로그래머스
- 완주하지 못한 선수
- 피보나치 수의 확장
- 소수 만들기
- 백준5710
- 백준1339
- 경비원
- 움직이는 미로 탈출
Archives
- Today
- Total
Today.dev
[BOJ_12904/Python] A와 B 본문
문제
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.
이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.
- 문자열의 뒤에 A를 추가한다.
- 문자열을 뒤집고 뒤에 B를 추가한다.
주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 999, 2 ≤ T의 길이 ≤ 1000, S의 길이 < T의 길이)
출력
S를 T로 바꿀 수 있으면 1을 없으면 0을 출력한다.
풀이
백트래킹으로 푸는 문제라고 생각했다. 그런데 노드의 유망성을 잘 검사했다고 생각했는데도 시간초과가 발생했다.
import sys
sys.setrecursionlimit(10**6)
def recursion(s):
if len(s) > len(T):
return
if s == T:
print(1)
exit(0)
if s in T or s[::-1] in T:
recursion(s + "A")
recursion(s[::-1] + "B")
# 입력
S = input().strip()
T = input().strip()
# 풀이
recursion(S)
# 출력
print(0)
개선한 풀이
S에서 T를 만드는게 아니라 T에서 S를 만들어야겠다고 생각했다.
트리구조를 직접 그려본 결과 S에서 T를 만드는 과정에서는 많은 노드를 탐색하는 반면, T에서 S를 만드는 과정은 정답루트만 존재한다는 것을 발견했다.
완성된 코드는 다음과 같다.
# 입력
S = input().strip()
T = input().strip()
# 풀이
while True:
if len(T) <= len(S):
break
if T[-1] == 'A':
T = T[:-1]
else:
T = T[:-1]
T = T[::-1]
# 출력
print(1 if S == T else 0)
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ_1339/Python] 단어 수학 (0) | 2021.05.31 |
---|---|
[BOJ_16234/Python] 인구 이동 (0) | 2021.05.31 |
[BOJ_1788/Python] 피보나치 수의 확장 (0) | 2021.05.31 |
[BOJ_2573/Python] 빙산 (0) | 2021.05.31 |
[BOJ_2564/Python] 경비원 (0) | 2021.05.25 |
Comments