[파이썬] 백준 9177번 단어 섞기
작성:
백준 #9177 단어 섞기
- 출력: Data set n: yes / no
- 체크할 조건
- 1 <= n <= 1000
- 1 <= (첫 번째, 두 번째 단어 길이) <= 200
- 세 번째 단어의 각 글자를 BFS의 각 층으로 생각하고 BFS 진행
w1
(첫 번째 단어)와w2
(두 번째 단어)의 초기 인덱스 (0, 0)부터 시작w1
과w2
에서 현재 인덱스 (각각a
,b
)가 가리키는 문자가w3
(세 번째 단어)의 현재 인덱스가 가리키는 문자와 같다면, 해당 인덱스 순서쌍을 큐에 삽입
- BFS가 모두 완료된 후
w3
이 모두 순회되었다면yes
, 아니면no
를 출력한다.
1. 틀린 풀이 (메모리 초과)
from collections import deque
import sys
input = sys.stdin.readline
def solution(n):
w1, w2, w3 = input().split()
i = 0
q = deque([(0, 0)])
while q:
for _ in range(len(q)):
a, b = q.popleft()
if a < len(w1) and w1[a] == w3[i]:
q.append((a+1, b))
if b < len(w2) and w2[b] == w3[i]:
q.append((a, b+1))
i += 1
tf = 'yes' if i == len(w3)+1 else 'no'
print('Data set {0}: {1}'.format(n, tf))
if __name__ == '__main__':
for i in range(1, int(input())+1):
solution(i)
- 이미 체크한 인덱스 순서쌍도 큐에 중복되어 많이 들어가기 때문에 메모리가 초과된다.
visited
배열을 이용하여 체크한 인덱스 순서쌍을 중복으로 큐에 들어가지 않게 한다.
2. 정답
from collections import deque
import sys
input = sys.stdin.readline
def solution(n):
w1, w2, w3 = input().split()
i = 0
q = deque([(0, 0)])
visited = [[0] * (len(w2)+1) for i in range(len(w1)+1)]
while q:
for _ in range(len(q)):
a, b = q.popleft()
if a < len(w1) and not visited[a+1][b] and w1[a] == w3[i]:
visited[a+1][b] = 1
q.append((a+1, b))
if b < len(w2) and not visited[a][b+1] and w2[b] == w3[i]:
visited[a][b+1] = 1
q.append((a, b+1))
i += 1
tf = 'yes' if i == len(w3)+1 else 'no'
print('Data set {0}: {1}'.format(n, tf))
if __name__ == '__main__':
for i in range(1, int(input())+1):
solution(i)
댓글남기기