데이터를 저장하거나 관리하는 방법
크게 선형 구조와 비선형 구조로 나눌 수 있다.자료구조는 코딩테스트와 실무에서 시간복잡도를 줄이는 핵심 도구이기 때문에 반드시 이해해야 함.
배열 (Array)
O(1) O(n)연결 리스트 (Linked List)
O(n) O(1) (단, 해당 위치를 알고 있을 때)스택 (Stack, LIFO)
append(), pop() 큐 (Queue, FIFO)
collections.deque 활용 트리 (Tree)
O(log n) 그래프 (Graph)
O(1) name = 'ABCDEF'
arr = [
[0,1,1,0,0,0],
[0,0,0,1,1,0],
[0,0,0,0,0,1],
[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0]
]
장점: 메모리 효율적 (간선이 적을 경우 유리)
단점: 특정 간선 존재 여부 확인은 느림
arr = [[1,2],
[3,4],
[5],
[],
[],
[]]

-> 따라서 간선이 많은 밀집 그래프(dense graph)는 인접 행렬, 간선이 적은 희소 그래프(sparse graph)는 인접 리스트가 효율적입니다.
name = 'ABCDEF'
def dfs(now):
print(name[now], end=' ')
for i in range(6):
if arr[now][i] == 1:
dfs(i)
dfs(0) # A부터 탐색
# 인접 리스트 DFS
arr = [[] for _ in range(N)]
for _ in range(M):
s, e = map(int, input().split())
arr[s].append(e)
def dfs(now):
print(now, end=' ')
for nxt in arr[now]:
dfs(nxt)