Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자입니다

[코딩테스트] 1260번 DFS와 BFS 본문

카테고리 없음

[코딩테스트] 1260번 DFS와 BFS

끈기JK 2024. 11. 4. 20:28

내 코드

N, M, V = map(int, input().split(' '))


def dfs(graph, start, visited, order):
    visited[start] = True
    order.append(start)

    for e in graph[start]:
        if not visited[e]:
            dfs(graph, e, visited, order)


def bfs(graph, start, visited, order):
    queue = [start]

    while queue:
        item = queue.pop(0)
        if not visited[item]:
            visited[item] = True
            order.append(item)
            queue.extend(graph[item])


graph = [[] for _ in range(N + 1)]

for _ in range(M):
    A, B = map(int, input().split(' '))
    graph[A].append(B)
    graph[B].append(A)

visited = [False] * (N + 1)
order = []
dfs(graph, V, visited, order)
print(' '.join(map(str, order)))

visited = [False] * (N + 1)
order = []
bfs(graph, V, visited, order)
print(' '.join(map(str, order)))

 

 

 

chatGPT 개선 문의

코드가 전반적으로 잘 작성되었습니다. DFS와 BFS 모두 정상적으로 작동하며, 간단하고 깔끔한 방식으로 구현되어 있습니다. 다만, 몇 가지 개선 사항을 제안해 볼 수 있습니다.

개선 사항

1. 간선 정렬: 문제에서 언급된 것처럼 정점 번호가 작은 순서대로 방문해야 하므로, graph에 간선을 추가한 후, 각 리스트를 정렬해주는 것이 필요합니다. 입력된 간선은 순서가 보장되지 않기 때문에, 정렬하지 않으면 원하는 결과가 나오지 않을 수 있습니다.

for neighbors in graph:
    neighbors.sort()

 

2. BFS에서 deque 사용: queue의 pop(0)은 리스트의 첫 번째 요소를 제거하면서 모든 요소를 앞으로 이동시키기 때문에 시간 복잡도가 O(N)입니다. 대신, collections.deque를 사용하여 O(1)로 popleft()할 수 있습니다.

from collections import deque

def bfs(graph, start, visited, order):
    queue = deque([start])
    while queue:
        item = queue.popleft()
        if not visited[item]:
            visited[item] = True
            order.append(item)
            queue.extend(graph[item])

 

3. visited 초기화 및 결과 출력 코드 개선: visited와 order 변수를 초기화하는 부분이 중복되므로, 이를 함수로 만들어 간단하게 만들 수 있습니다.

def reset_visited_and_order(n):
    return [False] * (n + 1), []

visited, order = reset_visited_and_order(N)
dfs(graph, V, visited, order)
print(' '.join(map(str, order)))

visited, order = reset_visited_and_order(N)
bfs(graph, V, visited, order)
print(' '.join(map(str, order)))

 

4. 코드 전체: 위의 개선 사항을 반영한 코드는 아래와 같습니다.

from collections import deque

def dfs(graph, start, visited, order):
    visited[start] = True
    order.append(start)
    for e in graph[start]:
        if not visited[e]:
            dfs(graph, e, visited, order)

def bfs(graph, start, visited, order):
    queue = deque([start])
    while queue:
        item = queue.popleft()
        if not visited[item]:
            visited[item] = True
            order.append(item)
            queue.extend(graph[item])

def reset_visited_and_order(n):
    return [False] * (n + 1), []

N, M, V = map(int, input().split())
graph = [[] for _ in range(N + 1)]

for _ in range(M):
    A, B = map(int, input().split())
    graph[A].append(B)
    graph[B].append(A)

for neighbors in graph:
    neighbors.sort()

visited, order = reset_visited_and_order(N)
dfs(graph, V, visited, order)
print(' '.join(map(str, order)))

visited, order = reset_visited_and_order(N)
bfs(graph, V, visited, order)
print(' '.join(map(str, order)))

 

요약

 

  • 간선 정렬로 올바른 탐색 순서 보장
  • BFS에 deque 사용으로 성능 개선
  • visited 초기화 코드 리팩토링

 

 

 

내 생각 정리

  • def 를 위로 올리고, input() 부분을 아래로 위치하는 걸로 통일해야겠다.
  • queue 사용할때 성능 개선을 위해 deque를 써야겠다.
  • 중복 코드는 함수로 묶어야겠다.