Computer/Coding Tests
[코딩 테스트]BFS로 보는 [Bool] v.s. [Node], visited 배열 쓸 때와 result 배열만 쓸 때의 차이(서로 관련 있음)
이르리의 공부일지
2025. 3. 26. 21:34
BFS 구현방식이 다양해서 차이를 알아보도록 하자.
사전지식
1. DFS, BFS 의 개념
2. DFS, BFS 의 자료구조(인접행렬, 인접리스트)
3. 시간 복잡도
목차
1. [Bool] 방식과 [node] 방식의 차이점
2. visited 배열 쓸 때와 result 배열만 쓸 때의 차이점
사실 1번 2번은 같은 내용이다.
살펴보자.
1. [Bool] 방식과 [Node] 방식의 차이점
편의상 구분 | 방식 | 예시 | 의미 |
[Bool] 방식 | visited = [False] * N | visited[node] = True | 빠른 방문 체크를 위해 사용 |
[Node] 방식 | if node in result: | result.append(node) | 방문 여부를 결과 저장을 겸해서 체크 |
1️⃣ visited = [False] * N (Bool 리스트)
✅ 장점
- 빠르다! → 시간복잡도 O(1)으로 방문 여부 확인 가능
- 중복 방문 방지가 명확
- 노드 방문 순서와 무관하게 관리 가능
❌ 단점
- result와 visited 두 개의 리스트를 써야 해서 코드가 길어질 수 있음
visited = [False] * len(graph)
if not visited[node]:
visited[node] = True
result.append(node)
2️⃣ if node not in result: 방식
✅ 장점
- 코드가 간단해보임
- visited 따로 안 만들어도 됨
❌ 단점
- in 연산은 리스트에서는 O(N) 시간 소요 → 비효율적
- 그래프 크기 커지면 속도 차이 큼
- 실수로 중복 넣기 쉬움
if node not in result:
result.append(node)
+) 추가
리스트 대신 set()을 쓰면 in 연산이 O(1)이긴 한데, 순서가 유지되지 않아서 탐색 순서를 중요시할 때 문제가 생김.
2. visited 배열 쓸 때와 result 배열만 쓸 때의 차이
위의 글을 읽으면
visited, result 함께 쓰는 경우 => [Bool] 방식,
result만 쓰는 경우 => [Node] 방식
임을 알 수 있다.
코드로 비교해보자.
# BFS - visited 사용
from collections import deque
def bfs_with_visited(graph, start):
visited = [False] * len(graph)
queue = deque([start])
result = []
visited[start] = True
while queue:
node = queue.popleft()
result.append(node)
for neighbor in graph[node]:
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
return result
# BFS - result만 사용
from collections import deque
def bfs_with_result_only(graph, start):
queue = deque([start])
result = []
while queue:
node = queue.popleft()
if node not in result:
result.append(node)
for neighbor in graph[node]:
queue.append(neighbor)
return result
결론
상황 | 추천 방식 |
노드 수가 적고 간단히 테스트 | result만 써도 됨 |
실전 문제, 탐색 순서 중요, 효율 중시 | visited (bool 리스트) 추천 |
그래프가 커짐 (ex. 수천~수만 노드) | 반드시 visited 필요 |
- DFS/BFS에서 visited는 빠르고 명확한 방문 체크 도구
- result만으로 방문 체크하면 단순하지만 비효율적
- 실무/코딩테스트에선 대부분 visited 따로 씀