접근
BFS로 풀었다. 큐에서 단어를 꺼내면 -> 그 단어에서 토 달기 규칙을 지키면서 사전에 등재된 단어들을 큐 안에 넣어줬다. 이게 check 함수이다.
어떤 단어(target_word)가 들어오면, 사전을 쭉 ~ 본다. 그러면서 target_word에서 토달기를 했을 때 사전의 해당 단어가 될 수 있다면, 리스트에 넣었다.
일단 토달기는 한 글자만 더할 수 있으니까, 사전의 단어 길이가 target_word+1인지 봤다. 아니라면 continue.
그 다음에 토달기 방식 중에 맨 앞이나 맨 뒤에 한 글자 넣는 경우를 봤다. 단순하게 in으로 체크했다.
마지막으로는 토달기 방식 중 중간에 한 글자 넣은 경우인지 봤다. 이 부분이 젤 까다로운 것 같다.
나는 while을 이용해서 사전에서 보고 있는 단어와 target_word의 글자를 하나씩 비교했다. 둘이 겹치면 target_word와 사전 해당 단어의 인덱스를 1 더하고, 안 겹치면 사전 해당 단어의 인덱스만 1 더했다. 사전 단어의 글자들을 하나 하나 끝까지 본 후에, target_word의 인덱스가 어디까지 왔는지 봤다. 만약에 target_word가 끝까지 왔다면, 사전 해당 단어가 target_word에서 글자 하나만 추가 되었고, 나머지는 순서가 다 같다는 뜻이다. 순서가 틀어진다면, target_word 인덱스가 끝까지 오지 못했을 것이다.
매번 큐에서 꺼낼 때마다 그 단어를 ans로 바꿔줬다. 큐에서 꺼내는 단어는 이전 단어 길이와 같거나, 그것보다 기니까.! 답이 여럿일 경우 어느 것이든 상관 없다고 했으니까 그렇게 갱신해줬다.
python으로는 시간 초과ㅠ
pypy로는 통과 !
코드
import collections
import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())
directions = [(0, -1), (0, 1), (-1, 0), (1, 0)]
d, first_word = input().split()
words = list(input().strip() for _ in range(int(d)))
ans = 0
# target_word에서 한 글자 토 달기해서 사전에 있는 단어 만들 수 있는지
def check(target_word):
after_words = []
target_word_len = len(target_word)
for word in words: # 사전의 단어
# 글자 수 하나만 더 많아야 함
if (target_word_len + 1) != len(word):
continue
# 포함 되면(맨 앞이나 맨 뒤에 붙는 것)
if target_word in word:
after_words.append(word)
continue
# 중간에 포함되는지
target_word_idx = 0
word_idx = 0
while word_idx < len(word):
if word[word_idx] == target_word[target_word_idx]:
target_word_idx += 1
word_idx += 1
if target_word_idx == len(target_word):
after_words.append(word)
return after_words
# 사전에 있고, 토 달기한 단어를 BFS에 넣어 주기
def bfs():
global ans
q = collections.deque()
q.append(first_word)
while q:
word = q.popleft()
ans = word
tmp = check(word)
q.extend(tmp)
return
bfs()
print(ans)
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 2343: 기타 레슨 (0) | 2021.11.20 |
---|---|
[백준-파이썬] 15686: 치킨 배달 (0) | 2021.11.17 |
[백준-파이썬] 1600: 말이 되고픈 원숭이 (2) | 2021.11.10 |
[백준-파이썬] 1182: 부분수열의 합 (0) | 2021.11.07 |
[백준-파이썬] 17114:미세먼지 안녕! (0) | 2021.11.06 |