인접행렬
- 자기 자신 : 0
- 연결 된 엣지 : 1 (또는 1*weight)
- 연결 안 된 엣지 : Inf (무한대 값으로 0과 구분)
# infinite 값을 선언하기
INF = float('inf')
# 행렬 그래프로 나타내기 - 가중치 weight 고려해서 표현
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
도시끼리 연결되었는지 어떻게 확인할까?
graph[0][1]
>>> 7 (0번과 1번 도시가 연결됨)
graph[2][1]
>>> inf (2번과 1번 도시가 연결 안 됨)
인접리스트
모든 노드에 연결된 노드에 대한 정보를 차례차례 연결하여 저장
# 연결된 도시만 리스트로 표현
graph = [
[(1, 7), (2, 5)], # --> 0번 도시의 연결 리스트업
[(0, 7)], # --> 1번 도시의 연결 리스트업
[(0, 5)] # --> 2번 도시의 연결 리스트업
]
도시끼리 연결되었는지 연결리스트로는 어떻게 확인할까?
graph[0][0][1]
>>> 7
# 행렬보다 직관성은 떨어질 수 있다.
리스트 대신 딕셔너리로 표현하여 연결성을 좀 더 직관적으로 표현할 수도 있다.
graph_dict = {
"0" : [("1", 7), ("2", 5)],
"1" : [("0", 7)],
"2" : [("0", 5)],
}
만약 문제에서 0번 도시가 없고 1번 도시부터 있는 경우
graph = [
[], # --> 0번 도시는 비워두고 시작
[(1, 7), (2, 5)], # --> 1번 도시부터 기록
[(0, 7)],
[(0, 5)]
]
이렇게 0번 도시를 빈칸으로 넣어 주면 나중에 인덱스 헷갈릴 일이 없다!!! 꿀팁
[메모리]
인접 행렬(Adjacency Matrix): 모든 관계를 저장하므로 노드 개수가 많을 수록 불필요한 메모리가 소요된다.
인접 리스트(Adjacency List): 연결된 정보만을 저장하기 때문에 메모리를 효율적으로 사용한다.
출처 입력
[속도]
인접 행렬(Adjacency Matrix): 모든 경우의 수가 제시되어 있으므로 인접리스트보다 빠르다.
인접 리스트(Adjacency List): 인접행렬방식에 비해 정보를 얻는 속도가 느리다. 인접리스트방식에서는 연결된 데이터를 하나씩 확인해야 하기 때문이다.
출처 입력
"두 노드 간에 연결이 있는지 없는지에 대한 확인" 문제
→ 인접행렬이 빠르다
"노드에 연결된 모든 노드들을 순회/탐색" 문제
→ 인접리스트가 효율적이다
'Code > algorithm' 카테고리의 다른 글
알고리즘 | BFS 활용하여 특정 도시 거리 계산 문제 풀기 (0) | 2024.04.01 |
---|---|
알고리즘 | queue(FIFO) 속도이슈를 해결할 수 있는 deque (0) | 2024.04.01 |
알고리즘 | 정렬 (선택정렬/삽입정렬/버블정렬) (0) | 2024.04.01 |
알고리즘 | 탐색 기본 - Stack, Queue (0) | 2024.04.01 |
알고리즘 | 탐색 기본, DFS / BFS (0) | 2024.04.01 |