일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 파이썬
- 백준 #파이썬 #알고리즘 #코딩테스트
- 백트랙킹
- 백준
- 파이썬 #백준 #알고리즘 #코딩테스트
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- react #리액트 #동빈나 #나동빈 #유튜브강의
- java #자바 #동빈나
- 코딩테스트
- 자바 #java
- DFS
- java #자바 #나동빈
- PYTHON
- 재귀
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- css #웹 #생활코딩
- css #생활코딩 #웹
- 백준 #알고리즘 #파이썬 #코딩테스트
- BFS
- react #리액트 #동빈나
- java #자바 #생활코딩
- 프로그래머스
- 다이나믹프로그래밍
- java #자바
- 다익스트라
- 투포인터
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- Dijkstra
- dp
- 알고리즘
Archives
- Today
- Total
커리까지
[프로그래머스] 단어 변환 파이썬 본문
728x90
SMALL
문제 설명
두 개의 단어 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 안에 없기 때문에 변환할 수 없습니다.
참고 답안
- 처음에 생각했던 답안은
begin
에서 알파벳을 하나씩 변경해서q
에 담는 방법으로 생각했다. - 하지만 그렇게 하면 시간복잡도에서 안 될것 같아 틀린 답안이라고 결정하였다.
- 결국 해결책은
words
를 순회하면서 지금 단어와 한 글자씩 비교하며 한 개의 글자가 다르면q
에 담는식으로 구성하는 것이었다. - 그리고 방문했던 글자는 또 방문할 필요가 없기에
visited
를 활용한다. hot
과hit
을 한 글자씩 비교하면o
와i
한 개만 다르기에q
에 담아준다.- 비교 하는 방법은
zip
을 활용하여 한 글자씩 가져오도록 한다. - 현재 깊이에서 다음 깊이로 넘어가야 하기에 깊이를
+1
하여 담는다.
- 비교 하는 방법은
target
이랑 단어가 일치하면cnt
를 리턴하고 그렇지 않으면answer
가 리턴된다.
from collections import deque
def solution(begin, target, words):
q = deque([(begin,0)])
visited = [False] * len(words)
answer = 0
while q:
word, cnt = q.popleft()
if word == target:
return cnt
for i, i_word in enumerate(words):
temp_cnt = 0
if not visited[i]:
for i_w, w in zip(i_word, word):
if i_w != w:
temp_cnt += 1
if 1 < temp_cnt:
break
if temp_cnt == 1:
q.append((i_word, cnt + 1))
visited[i] = True
return answer
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[프로그래머스] 단속 카메라 파이썬 (0) | 2023.06.09 |
---|---|
[프로그래머스] 숫자 게임 파이썬 (0) | 2023.06.08 |
[프로그래머스] 야근 지수 파이썬 (0) | 2023.06.06 |
[프로그래머스] 최고의 집합 파이썬 (0) | 2023.06.05 |
[프로그래머스] 등산코스 정하기 파이썬 (0) | 2023.05.21 |
Comments