python-for-coding-test icon indicating copy to clipboard operation
python-for-coding-test copied to clipboard

147p DFS예제 질문있습니다.

Open TChaper opened this issue 5 years ago • 1 comments

다른방법으로 한번 풀어봤는데 순서가 약간 다르게 나옵니다.

def dfs(graph, start_node): visited, need_visit = list(), list() need_visit.append(start_node)

while need_visit:
    node = need_visit.pop()
    if node not in visited:
        visited.append(node)
        need_visit.extend(graph[node])

return visited

dfs(graph, 1)

결과값이 이렇게 출력이 됩니다. [1, 8, 7, 6, 2, 3, 5, 4]

TChaper avatar Oct 14 '20 08:10 TChaper

안녕하세요, @TChaper 님!

적어주신 코드는 재귀 함수를 이용하지 않고 스택을 이용한 방식으로 작성하신 것으로 보입니다.

작성하신 코드를 기반으로 정상적으로 동작하는 코드를 만들어 보았습니다.

책의 이론 파트에 적혀 있는 설명을 참고하셔서 코드를 작성해 보시며 연습하시는 것을 추천 드립니다. (137 페이지 참고)

# DFS 함수 정의
def dfs(graph, v):
    visited = [False] * (len(graph) + 1)
    # 탐색 시작 노드를 스택에 삽입하고 방문 처리
    stack = [v]
    visited[v] = True
    print(v, end=' ')
    while stack:
        # 스택의 최상단 노드
        v = stack[-1]
        for i in graph[v]:
            # 최상단 노드에 방문하지 않은 인접 노드가 있으면
            if not visited[i]:
                # 그 인접 노드를 스택에 넣고 방문 처리
                stack.append(i)
                visited[i] = True
                print(i, end=' ')
                break
        # 방문하지 않은 인접 노드가 없으면 스택에서 꺼내기
        if v == stack[-1]:
            stack.pop()

# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 정의된 DFS 함수 호출
dfs(graph, 1)

ndb796 avatar Jan 11 '21 22:01 ndb796