Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Python] ๋‹จ์–ด ๋ณ€ํ™˜

meeeeejin 2021. 3. 31. 18:11

๋ฌธ์ œ ๋งํฌ: programmers.co.kr/learn/courses/30/lessons/43163

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋‹จ์–ด ๋ณ€ํ™˜

๋‘ ๊ฐœ์˜ ๋‹จ์–ด begin, target๊ณผ ๋‹จ์–ด์˜ ์ง‘ํ•ฉ words๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ด์šฉํ•˜์—ฌ begin์—์„œ target์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ณ€ํ™˜ ๊ณผ์ •์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 1. ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜

programmers.co.kr

 

 

๋ฌธ์ œ ์„ค๋ช…

๊ฐ ๋‹จ์–ด๊ฐ€ ํ•œ ๊ธ€์ž์”ฉ๋งŒ ์ฐจ์ด ๋‚˜๋Š” ๊ฒฝ์šฐ(ex. hot๊ณผ hit) ๋‹จ์–ด ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

๋‹จ์–ด๋“ค์„ ์ •์ ๋“ค๋กœ, ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ„์„ ์œผ๋กœ ํ‘œ์‹œํ•ด์„œ BFS๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

  1. begin์„ ํฌํ•จํ•ด์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด words์— begin ๋‹จ์–ด๋ฅผ ์‚ฝ์ž…
  2. ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
  3. ์ด๋•Œ ๋‘ ๋‹จ์–ด๊ฐ€ ์ •ํ™•ํžˆ "ํ•œ ๊ธ€์ž"๋งŒ ์ฐจ์ด ๋‚  ๊ฒฝ์šฐ ์ธ์ ‘ํ•œ ๊ฑธ๋กœ ๊ฐ„์ฃผ
  4. begin ๋‹จ์–ด ๋ถ€ํ„ฐ BFS ์ˆ˜ํ–‰
  5. ์ด๋•Œ depth๋Š” begin๋ถ€ํ„ฐ ํ˜„์žฌ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ(๋ณ€ํ™˜ ํšŸ์ˆ˜)๋ฅผ ์˜๋ฏธ
  6. BFS ์ค‘์— target์— ๋„๋‹ฌํ•˜๋ฉด depth๋ฅผ return

 

 

์†Œ์Šค์ฝ”๋“œ

from collections import deque

# word graph์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
def init_graph(graph, words):
    for i in range(len(words)):
        for j in range(len(words)):
            cnt = 0
            for k in range(len(words[i])):
                if words[i][k] != words[j][k]:  # ๋‘ ๋‹จ์–ด์˜ ๊ฐ ๊ธ€์ž๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ
                    cnt += 1
                if cnt > 1: # ๋‘ ๋‹จ์–ด๊ฐ€ ํ•œ ๊ธ€์ž ์ด์ƒ ์ฐจ์ด ๋‚˜๋Š” ๊ฒฝ์šฐ
                    break
            if cnt == 1:
                graph[i].append(j)


def bfs(start, target, words):
    graph = [[] for _ in range(len(words))]
    init_graph(graph, words)
    visited = [False] * len(words)
    depth = [0] * len(words)

    # BFS ์‹œ์ž‘
    queue = deque([start])
    visited[start] = True

    while queue:
        v = queue.popleft()
        for x in graph[v]:
            # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ์ •์  ๋ฐฉ๋ฌธ
            if not visited[x]:
                queue.append(x)
                visited[x] = True
                # ํ˜„์žฌ ์ •์ ์˜ depth๋Š” ๋ถ€๋ชจ ์ •์ ์˜ depth + 1
                depth[x] = depth[v] + 1
                # target์— ๋„๋‹ฌํ–ˆ์„ ๊ฒฝ์šฐ
                if words[x] == target:
                    return depth[x]

    return 0   # target์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ


def solution(begin, target, words):
    answer = 0
    words.append(begin)
    # begin์„ ์ œ์ผ ๋’ค์— ์‚ฝ์ž… ํ–ˆ์œผ๋ฏ€๋กœ begin์˜ ์ธ๋ฑ์Šค๋Š” words์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค
    answer = bfs(len(words) - 1, target, words)
    return answer

 

 

 

 

 

728x90