https://programmers.co.kr/learn/courses/30/lessons/43163
문제 설명
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.
예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
제한사항
- 각 단어는 알파벳 소문자로만 이루어져 있습니다.
- 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
- words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
- begin과 target은 같지 않습니다.
- 변환할 수 없는 경우에는 0를 return 합니다.
입출력 예
begin | target | words | return |
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log", "cog"] | 4 |
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log"] | 0 |
예제 #1
문제에 나온 예와 같습니다.
예제 #2
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.
풀이
import collections
def solution(begin, target, words):
answer = 0
dq = collections.deque()
dq.append([begin, 0]) # 결과로 확인하기 위해 거쳐간 횟수들도 단어와 같이 묶어서 넣어준다.
visited = [0 for i in range(len(words))]
while dq:
now, cnt = dq.popleft()
if now == target:
answer = cnt
else:
for i in range(len(words)):
if visited[i] == 0:
temp = check(now, words[i])
if temp == 1:
dq.append([words[i], cnt+1])
visited[i] = 1
return answer
def check(a,b): # 한글자만 다른지 확인하는 함수
cnt = 0
for i in range(len(a)):
if a[i] != b[i]:
cnt += 1
return cnt
BFS를 사용하여 풀었다.
전체적인 프로세스는 다음과 같다.
begin의 단어를 deque에 넣어준다. -> words를 탐색하며 한글자만 다른 단어들을 모두 deque에 넣어준다. -> popleft 한 단어와 한글자만 다른 단어들을 모두 deque에 넣어준다.(반복) -> popleft한 단어가 target의 단어와 같아질 때 거쳐간 횟수를 answer에 넣어준다.
deque에 단어들을 넣어줄 때마다 각 단어까지 거쳐온 횟수도 같이 묶어서 넣어주었다.
처음에는 visited를 통해 방문체크를 하지 않고 풀었는데 시간초과가 나와서 visited를 사용해 방문한 단어는 사용하지 않도록 해 주었는데 문제 없는걸 보니 괜찮은 것 같다. 이미 거쳐간 단어가 또 등장하는건 의미 없이 한바퀴를 돈 것이 되기 때문에 모든 단어들은 한 번씩만 거쳐가는게 맞는 것 같다.
두 단어 간에 다른 글자 횟수를 세주는 check()함수를 통해 다른 글자 수를 체크하고, 그 수가 1인 단어들을 deque에 넣어준다.
popleft한 단어가 target과 일치하게 되면 그 때의 cnt(거쳐간 횟수)를 answer로 넣어준다.
처음에는 target이 되기 위해 거쳐오는 모든 경우의 수를 구하고 그 중에서 최소값을 구하려고 했는데, 생각해보니 가장 먼저 target과 일치하는 단어가 나오면 그 때가 최소 변환 횟수가 되기 때문에 바로 결과를 구해주었다.
'코테공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - DFS/BFS] 게임 맵 최단거리 (Python3) (0) | 2022.10.09 |
---|---|
[프로그래머스 - 2022 카카오 신입공채 1차] - 신고 결과 받기 (0) | 2022.09.20 |
[프로그래머스 - 완전탐색] 모의고사 (Python3) (0) | 2022.06.21 |
[프로그래머스 - 2021 카카오 채용연계형 인턴십] - 숫자 문자열과 영단어 (Python3) (0) | 2022.06.21 |
[프로그래머스 - DFS/BFS] 타겟 넘버 (Python3) (0) | 2022.06.21 |