๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋‹จ์–ด ๋ณ€ํ™˜ (level3, python)

๊ฐœ๋ฐœ์ž HOON 2022. 9. 13. 13:36

๋ฌธ์ œ ์„ค๋ช…

 

๋‘ ๊ฐœ์˜ ๋‹จ์–ด 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 ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ


์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

 

์˜ˆ์ œ #1
๋ฌธ์ œ์— ๋‚˜์˜จ ์˜ˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์ œ #2
target์ธ "cog"๋Š” words ์•ˆ์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


ํ’€์ด ์ฝ”๋“œ

from collections import deque

def compare(a, b):
    cnt = 0
    for idx, string in enumerate(a):
        if b[idx] == string:
            cnt += 1
            
    return True if cnt == len(b)-1 else False

def bfs(begin, target, words):
    queue = deque()
    queue.append([begin, 0])
    visited = {key:False for key in words}
    result = []
    
    while queue:
        word, count = queue.popleft()
        if word == target: 
            result.append(count)
            continue
            
        if word != begin:
            visited[word] = True
        
        for other in words:
            if not visited[other] and compare(word, other):
                queue.append([other, count + 1])
                
    return min(result) if result else 0
    

def solution(begin, target, words):
    answer = bfs(begin, target, words)
    return answer

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)๋ฅผ ํ™œ์šฉํ•ด ํ’€์—ˆ๋‹ค.

 

ํ ๋‚ด๋ถ€์— [ํ˜„์žฌ ๋‹จ์–ด, ๊ฑฐ์ณ ์ง€๋‚˜๊ฐ„ ์ˆ˜]๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ๋กœ์ง์„ ์‹œ์ž‘ํ•œ๋‹ค.

ํ˜„์žฌ ๋‹จ์–ด์™€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํƒ€๊ฒŸ ๋‹จ์–ด๊ฐ€ ๋™์ผํ•˜๋‹ค๋ฉด ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค์Œ ์›์†Œ์— ๋Œ€ํ•ด ๋„˜์–ด๊ฐ„๋‹ค.

์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ๋‹จ์–ด์™€ ๋น„๊ตํ•ด์„œ ํ•œ ์ž๋ฆฌ๋งŒ ๋‹ค๋ฅด๋‹ค๋ฉด, ํ์— ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๋„ฃ๊ณ , count๋ฅผ 1 ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

์ด ๋กœ์ง์„ ํ๊ฐ€ ๋‹ค ๋น„์šธ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ณ , ๊ฒฐ๊ณผ ๋ฐฐ์—ด ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์–ป์–ด๋‚ด๋ฉด ์ตœ์†Œํ•œ์˜ ๋‹จ๊ณ„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.