📃 문제 링크
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
5 5 3
5 4
5 2
1 2
3 4
3 1
3 1 2 5 4
3 1 4 2 5
일반적인 DFS/BFS 문제였다. 추가로 이 문제에서 고려해야 할 점은 양방향 노드라는 점과 정점 번호가 더 작은 것을 먼저 방문하기 위해 정렬 기능을 추가해야 한다는 점이었다.
전체 그래프(graph
)를 dict
타입으로 노드: [연결된 노드1, 연결된 노드2...]
형식으로 만들어준다. 위의 예제에서는 {5: [4, 2], 4: [5, 3], 2: [5, 1], 1: [2, 3], 3: [4, 1]}
가 될 것이다.
만들어진 graph
로 DFS
와 BFS
로 탐색해 출력해준다.
DFS
는 스택을 이용해 구현했다. 현재 방문할 수 있는 노드들 중 가장 작은 번호부터 먼저 방문할 수 있도록 현재 방문할 수 있는 노드들(=temp
)를 내림차순으로 정렬해준 후 스택에 넣어준다.
BFS
는 큐를 이용해 구현했고, 큐는 앞쪽에서 꺼내기 때문에 현재 방문할 수 있는 노드들을 오름차순으로 정렬해 큐에 넣어준다.
BFS를 일반적인 리스트로 구현한 점이 아쉬웠다. 아직 BFS/DFS에 익숙하지 않아서 리스트로 구현했는데, Python의 Queue
또는 deque
모듈을 사용해서 BFS를 구현한다면 더 효율적일 것 같다.
또 내가 구현한 코드는 방문할 수 있는 노드를 일단 스택 또는 큐에 모두 넣고, visited
에 있다면 그냥 다음 반복문으로 넘어가게 되어있는데, 애초에 처음부터 visited
에 있는지 판단해주어 중복되지 않은 노드만 스택 또는 큐에 넣는 방법이 더 좋을 것 같다. set
을 이용해서 구현해보려고 했으나 잘 되지 않아 일단 넘어갔다.