문제 링크
https://www.acmicpc.net/problem/12919
12919번: A와 B 2
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈
www.acmicpc.net
풀이
처음엔 bfs로 풀이했는데, 메모리 초과가 발생했다.
이후 dfs 백트래킹으로 바꿔 풀이했는데, 시간 초과가 발생하였다.
찾아보니 이 문제의 핵심은
S에서 T로 가능한지 찾는게 아니라, T에서 S가 가능한지 찾아야 한다고 한다.
S에서 T로 찾으면, 경우의 수가 너무 많아 실패한다고 한다...
이와 비슷한 문제를 이와 같은 방식이나 bfs로 푼 적이 있는 거 같은데, 어떤 기준인지 모르겠다.
늘 다양한 방법을 생각하고 시도해보자...
# 실패한 dfs 코드
def dfs(s, t, cnt):
global ans
if len(s) > len(t):
return
if s == t :
print(1)
exit(0)
tmp1 = s + 'A'
dfs(tmp1, t, cnt+1)
tmp2 = s + 'B'
tmp2= tmp2[::-1]
dfs(tmp2, t, cnt+1)
s = input()
t = input()
dfs(s,t,0)
print(0)
조건은 다음과 같다. T에서 S로 가능한지 탐색하는 것이므로 주어진 조건 반대로 탐색해야 한다.
1. T의 맨 뒤가 'A'이면 이를 제거하고, 탐색
2. T의 맨 앞이 'B'이면 제거하고, 거꾸로 바꿔서 탐색
양 방향에서 배열에 덧붙이고, 제거하는 것을 편하게 하기 위해서 deque를 사용했다.
from collections import deque
def dfs(s, t):
if len(t) == 0 :
return
if s == t :
print(1)
exit()
if t[-1] == 'A':
t.pop()
dfs(s, t)
t.append('A')
if t[0] == 'B':
t.popleft()
t.reverse()
dfs(s,t)
t.reverse()
t.appendleft('B')
s = deque(map(str,input()))
t = deque(map(str,input()))
dfs(s,t)
print(0)
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level1] 달리기 경주 - python (0) | 2023.08.02 |
---|---|
[Python] 반올림 처리하기 - 오사오입 (0) | 2023.03.05 |
[백준 1806번] 부분합 - python (0) | 2023.02.01 |
[프로그래머스][level3] 양과 늑대 - Python (0) | 2023.01.17 |
[백준 2167번] 2차원 배열의 합 - Python / 2차원 배열 누적합 (0) | 2023.01.17 |