일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- ds_store
- slicing [::-1]
- Python
- pandas
- 고차함수
- decorator
- r-string
- [초급(예비) 개발자 오픈소스 실무 역량강화 교육]
- PIP
- sort v.s. sorted
- sort(reverse=True) v.s. reverse
- timestamp
- blinker
- 코딩 테스트
- Airflow
- 순수함수
- 생각
- functools.wraps
- os.path
- CI/CD
- reverse v.s. reversed
- OS
- S3
- boto3
- 함수형 프로그래밍
- 쿼리
- selenium-wire
Archives
- Today
- Total
공부일지
[코딩 테스트]BFS로 보는 [Bool] v.s. [Node], visited 배열 쓸 때와 result 배열만 쓸 때의 차이(서로 관련 있음) 본문
Computer/Coding Tests
[코딩 테스트]BFS로 보는 [Bool] v.s. [Node], visited 배열 쓸 때와 result 배열만 쓸 때의 차이(서로 관련 있음)
이르리의 공부일지 2025. 3. 26. 21:34BFS 구현방식이 다양해서 차이를 알아보도록 하자.
사전지식
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 따로 씀
'Computer > Coding Tests' 카테고리의 다른 글
[코딩테스트]Python의 리스트의 얕은 복사를 통해 알아보는 참조문제 (0) | 2025.03.29 |
---|---|
[코딩 테스트]Python을 이용한 BFS, DFS 구현 방법(반복문, 재귀)(인접행렬, 인접 리스트) (0) | 2025.03.27 |
[코딩 테스트]시간 재는 모듈 time v.s. timeit 차이 (0) | 2025.03.21 |
[코딩 테스트]정렬 문제로 알아보는 Python 자료구조 비교(tuple, namedtuple, struct, class +__slots__) (0) | 2025.03.21 |
[코딩 테스트] 코드업 예제로 알아보는 Python 내장함수 reverse(), reversed()와 경과시간 (0) | 2025.03.11 |