자바생
728x90

이번에 백준 1325번 문제를 풀고  인접 행렬과, 인접 리스트의 차이에 대해 공부를 했다.

 

인접 행렬은 2차원배열로 dfs 그래프를 구현한 것이다.

그래서 장점으로는 구현이 쉽고, 노드끼리 연결이 되어있는지 아닌지 O(1)로 쉽게 알 수 있다. fc [i][j]에서 0인지 1인지만 구분하면 되기 때문이다. 

단점은 노드 i에 연결되있는 노드들을 확인하기 위해서는 fc [i][0] ~ fc [i][V]까지 전체 노드를 방문해야 하기 때문에 O(V)만큼 걸리기 때문이다.

만약에 노드가 수천만개이고, 간선이 달랑 3,4개라고 생각해보면 노드들이 어떻게 연결되어있는지 알아보기 위해서는 O(V^2)만큼 걸리는데, 간선이 노드에 비해 매우 적기 때문에 손해이다. 그래서 이러한 단점을 커버 치기 위해 인접 리스트가 존재한다.

 

인접 리스트는 ArrayList<E>를 사용하여 dfs그래프를 구현한 것이다.

이 문제를 풀면서 ArrayList<ArrayList<Integer>> 대신에 ArrayList<Integer> [] fc; 로 많이들 쓰셨는데 왜 그런지 모르겠다. 왜 그러는지는 나중에 다시 공부해서 알아봐야겠다.

 

그래서 인접리스트로 구현하면 실제로 연결된 노드들에만 정보를 저장한다. 그 말은 만약, 총 6개의 노드 중에 1번 노드에 2 3 4가 연결되어있으면 1 -> 2 3 4 이렇게 저장이 된다. ArrayList는 동적 배열이기 때문에 개수만큼 저장이 된다. 그래서 인접 행렬의 단점인 간선이 노드에 비해 적을 때, 한 노드의 원소의 개수합이 간선의 개수와 같기 때문에 O(E)의 시간이 걸리게 된다. 

 

하지만 단점은 노드i 와 j가 연결이 되어있는지 확인할 때는, 인접 행렬은 O(1)이었지만, 인접 리스트는 fc [i]의 ArrayList를 전부 돌면서 j 성분이 있는지 없는지 확인해야 하기 때문에, O(V)의 시간이 걸리게 된다. 

 

따라서 문제를 보면서 시간복잡도의 비교에 따라, 인접 행렬을 사용해도 되는지, 인접 리스트를 사용해도 되는지의 여부 판단을 잘해야 할 것 같다.

728x90

'Algorithm 개념' 카테고리의 다른 글

에라토스테네스의 체 & 유클리드 호제법  (0) 2021.04.26
정렬  (0) 2021.03.31
이분 탐색  (0) 2021.01.13
BFS  (0) 2020.11.11
DFS  (0) 2020.10.25
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그