프로그래머스_단어변환_재풀이(2)

임정민·2024년 1월 4일
0

알고리즘 문제풀이

목록 보기
138/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 15분


from collections import deque

def solution(begin, target, words):
    
    answer = 0
    queue = deque([[0,begin]])
    
    while queue:
        
        cnt, now = queue.popleft()
        
        if now == target:
            answer = cnt
            break
            
        for word in words:
            diff = 0
            for w1,w2 in zip(now,word):
                if w1!=w2:
                    diff += 1
            if diff == 1:
                words.remove(word)
                queue.append([cnt+1,word])
            
    return answer

시작하는 단어 begin, 타겟 단어 target, 시작에서 타겟까지 변환될 수 있는 단어 words가 주어지고 begin에서 최대 한글자씩 변환하여 words를 통해 target으로 가는 최소한의 단계를 구하는 문제입니다.🐣🐣🐣

BFS를 활용하여 queue구조에서 첫요소(시작점)를 begin으로 하고 한글자만 바꾸어 변환 가능한 words를 파악한뒤 [변환횟수,현재상태(word)]로 표현하여 append한 뒤 target까지 이를 반복하는 방식입니다.

[다른 사람의 풀이1]


from collections import deque

def solution(begin, target, words):
    answer = 0
    q = deque()
    q.append([begin, 0])
    V = [ 0 for i in range(len(words))]
    while q:
        word, cnt = q.popleft()
        if word == target:
            answer = cnt
            break        
        for i in range(len(words)):
            temp_cnt = 0
            if not V[i]:
                for j in range(len(word)):
                    if word[j] != words[i][j]:
                        temp_cnt += 1
                if temp_cnt == 1:
                    q.append([words[i], cnt+1])
                    V[i] = 1
                    
    return answer

'나의 풀이'와 같이 queue, BFS를 활용하되 다른점으로는 '나의 풀이'에서
시간을 줄이기 위해변환 단어 리스트(words)에서 다음 변환 가능 단어들을 제외하고 remove했던 표현을 위 코드에서는 다음 변환 가능 단어 리스트(V)를 활용하여 판별했다는 점입니다.🐁🐁🐁

[다른 사람의 풀이2]


from collections import deque

def get_adjacent(current, words):

    for word in words:
        if len(current) != len(word):
            continue

        count = 0
        for c, w in zip(current, word):
            if c != w:
                count += 1

        if count == 1:
            yield word

def solution(begin, target, words):
    dist = {begin: 0}
    queue = deque([begin])

    while queue:
        current = queue.popleft()

        for next_word in get_adjacent(current, words):
            if next_word not in dist:
                dist[next_word] = dist[current] + 1
                queue.append(next_word)

    return dist.get(target, 0)

유사하게 queue,BFS를 활용한 풀이입니다.🐇🐇🐇

조금 다른 점으로 현재 단어에서 한글자만 바꾸어 변환 가능한 단어들을 표현할 때get_adjacent(current,words)라는 함수 안의 yield를 통해 반복문을 순환시켰다는 점입니다.

자주 사용하지 않던 yield의 실제 활용방법을 알 수 있었습니다.

profile
https://github.com/min731

0개의 댓글