이 포스팅은 프로그래머스 시리즈 28 편 중 18 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - 04: 메뉴 리뉴얼
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - 07: 예상 대진표
  • Part 8 - 08: 다단계 칫솔 판매
  • Part 9 - 09: 불량 사용자
  • Part 10 - 10: 베스트 앨범
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - This Post
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - 24: 입국심사
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

일단 DFS로 풀었다. 근데 풀이를 보니 다 BFS로 풀었더라. 그래서 다음날 다시 도전할 거다.

DFS Code

def solution(phone_book):
    from collections import deque

def diff(word1, word2):
    ret = 0
    for a, b in zip(word1, word2):
        if a != b:
            ret += 1
    return ret
    
def DFS(begin, visited, words, target, count):
    # print(begin, visited, words, target, count)
    global answer
    if begin == target:
        answer = min(answer, count)
    
    for w in words:
        if visited[w] == False and diff(begin, w) == 1:
            visited[w] = True
            DFS(w, visited, words, target, count+1)
            visited[w] = False

def solution(begin, target, words):
    global answer
    answer = 1e6
    if target not in words:
        return 0
    
    visited = { w:False for w in words }
    visited[begin] = True
    DFS(begin, visited, words, target, 0)
    return answer

BFS Code

from collections import deque

def diff(word1, word2):
    count = 0
    for i in range(len(word1)):
        if word1[i] != word2[i]:
            count += 1
    return count

def solution(begin, target, words):
    if target not in words: return 0
    
    answer = 0
    q = deque()
    q.append([begin, 0, []])
    
    while q:
        word, count, path = q.pop()
        
        if word == target:
            answer = count
            break
        
        for w in words:
            if diff(w, word) == 1 and w not in path:
                q.append([w, count+1, path + [w]])
    
    return answer

Reference

단어 변환