본문 바로가기
코딩 테스트/프로그래머스

[DFS/BFS] 단어 변환

by 위그든씨 2023. 3. 30.

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/43163

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

  • begin 에 담긴 단어를 알파벳 하나씩 바꿔가며 target에 담긴 단어로 변환하는 과정
  • 규칙은 words 리스트에 담긴 단어들로만 변환 할 수 있음.
  • 딕셔너리를 이용해서 풀 수도 있겠지만 그냥 인덱스로 계산해서 코드를 짬
  • begin이 변할 수 있는 것들도 찾기 위해 일단 words에 담음
  • words에 담긴 각각의 단어들에 대해 자신이 변할 수 있는 모든 경로를 찾아서 그래프에 담음
  • 이후 begin(0번째 인덱스)을 큐에 담아서 BFS 탐색을 진행
  • next가 end(words에 담긴 target읜 인덱스) 와 같다면 cnt+1 을 리턴 해줌
  • while문이 끝났는데도 리턴 값이 없다면 존재하지 않는 경우이므로 0 

소스 코드

from collections import deque

def solution(begin, target, words):
    if(target not in words):
        return 0
    words=[begin]+words	 #begin으로부터 변환 할 수 있는 것들을 찾기 위해 words에 넣어줌
    end = words.index(target)
    n = len(words)
    k=len(begin)
    visited=[False]*n
    gr = [[]for i in range(n)]
    for i in range(n):		#각각의 단어들로부터 변환 할 수 있는 쌍들을 찾는 과정
        cur = words[i]
        for j in range(i+1,n):
            next = words[j]
            dif = 0
            for z in range(k):
                if cur[z]!=next[z]:
                    dif+=1
                if dif>=2:
                    break
            if dif==1:
                gr[i].append(j)
                gr[j].append(i)
    
    q=deque()
    q.append((0,0))
    visited[0]=True
    while(q):	//BFS
        cur,cnt = q.popleft()
        for next in gr[cur]:
            if visited[next]==True:
                continue
            if next==end:
                return cnt+1
            visited[next]=True
            q.appendleft((next,cnt+1))
    return 0

print(solution("hit","cog",["hot", "dot", "dog", "lot", "log", "cog"]))

 

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

[그리디] 단속 카메라  (0) 2023.04.03
[동적 계획법] 등굣길  (0) 2023.03.31
[DFS/BFS] 네트워크  (0) 2023.03.30
[연습 문제] 최고의 집합  (0) 2023.03.29
[힙] 이중 우선순위 큐  (0) 2023.03.29