TIL 웹개발 - 리스트(list)와 세트(set)의 시간 복잡도 차이

Thu, 18 Jul 2024 06:27:26 GMT

백준 11725번 문제를 푸는데 계속해서 시간초과로 난항을 겪고 있었다.

[https://www.acmicpc.net/problem/11725](https://www.acmicpc.net/problem/11725)

이 문제를 풀기 위해 내가 짠 코드는 다음과 같다.

```
import sys
from collections import deque
input = sys.stdin.readline

def bfs_queue(start):
parent = [0] * (n+1)
visited = [start]
q = deque([start])

while q:
node = q.popleft()
for adj in graph[node]:
if adj not in visited:
parent[adj] = node
q.append(adj)
visited.append(adj)

for i in range(2, n+1):
print(parent[i])

n = int(input())
graph = {i: [] for i in range(1, n+1)}
for _ in range(n-1):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
bfs_queue(1)
```

파이참에서 실행시켰을때는 입출력 예제와 똑같이 나왔기에 이제 여기서 줄일 만한 곳을 찾기 시작했다. graph를 딕셔너리로 만들었는데 리스트로 변경하면 좀 더 시간이 줄어들까 싶어 시도했지만 역시나 실패였다. 그후 몇 가지 시도를 하다보니 코드가 아예 틀리기도 했다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240718/154623_fT0NoP0GHLeo5WOMfT?q=80&s=1280x180&t=outside&f=webp)

결국 나는 그를 찾아갔다.

![왔니...?](https://upload.cafenono.com/image/slashpageHome/20240718/155029_HQ7QjhdSOg9rPR5yOO?q=80&s=1280x180&t=outside&f=webp)

거의 솔루션은 간단했다.
리스트(list)를 세트(set)로 변경하는 것이다.

위 코드 중 일부를 보면 입력값을 받아 그래프를 만든 후 부모 노드를 찾기 위해 bfs를 사용했다.

def bfs_queue(start):
parent = [0] * (n+1)
visited = [start]
q = deque([start])

while q:
node = q.popleft()
for adj in graph[node]:
if adj not in visited:
parent[adj] = node
q.append(adj)
visited.append(adj)

def bfs_queue(start):
parent = [0] * (n+1)
visited = set([start])
q = deque([start])

while q:
node = q.popleft()
for adj in graph[node]:
if adj not in visited:
parent[adj] = node
q.append(adj)
visited.add(adj)

visited는 방문한 노드를 중복 방문하지 않기 위해 만든 리스트다.
if문에 인접 노드가 이미 visited에 없다면 아래 코드를 반복해서 실행한다.

이때 if adj not in visited의 시간 복잡도는 O(n)이다.
하지만 visited를 세트(set)로 바꾸면 시간 복잡도는 O(1)이 된다.

리스트와 세트의 연산 차이점을 나타낸 표를 참고해보면,

| | 리스트(list) | 세트(set) |
| --- | --- | --- |
| 탐색(search) | O(n) | O(1) |
| 삽입(append) | O(1) | O(1) |
| 삭제(remove) | O(n) | O(1) |

리스트로 구성될 경우 처음부터 끝까지 순차적으로 탐색을 해야하기 때문에 O(n)이 되고
세트의 경우 해시 테이블을 사용하기 때문에 O(1)이 된다.

해시테이블의 위력... 내 링크도 함께 첨부해본다.

[TIL 웹개발 - 해시테이블 - TIL 웹개발](https://slashpage.com/kyugntae-ai/qrx6zk25jk8q3mv314y5)