[TIL/크래프톤 정글] DAY 19

배재준·2025년 3월 27일

크래프톤 정글 - TIL

목록 보기
12/93
post-thumbnail

2025.03.28

TIL(TODAY I LEARN)


  • WEEK03 :
    그래프(vertex, edge, node, arc), BFS, DFS, 위상정렬

  • 개념 정리를 해보자


🗑️그래프 (Graph)

✅ 정의

그래프는 여러 개의 정점(Vertex)과 이들을 연결하는 간선(Edge)으로 이루어진 자료구조입니다.

📚 기본 용어

용어의미
Vertex (Node)(정점)정점 (ex: 도시, 사람 등)
Edge(간선)두 정점을 연결하는 선
Directed Edge (Arc)방향이 있는 간선 (ex: A → B)
Undirected Edge방향이 없는 간선 (ex: A — B)
Degree(차수)한 정점과 연결된 간선의 개수
In-degree방향 그래프에서 들어오는 간선 수
Out-degree방향 그래프에서 나가는 간선 수
Cycle같은 정점으로 다시 돌아오는 경로가 존재하는 경우
  • 트리 = 방향 있는, 루트 있는, 사이클 없는 그래프
  • 그래프 = 노드 + 간선 = 연결만 있으면 다 됨

그래프의 특징

  • 같은 두 정점 사이에 여러 경로가 가능
    • 즉, 노드들 사이에 무방향/방향그래프에서 양방향 경로를 가질 수 있다.
  • self-loop 뿐 아니라 loop/circuit 모두 가능하다.
  • 관계는 방향성만 있을뿐, 위계구조가 없다.
  • 그래프는 순환(Cyclic) 혹은 비순환(Acyclic)이다.
  • 방향 그래프와 무방향 그래프가 있다.
  • 간선의 유무는 그래프에 따라 다르다.
    • 노드 간에 간선이 있을 수도, 없을 수도 있음
    • 희소 그래프(sparse): 간선 적음
    • 밀집 그래프(dense): 간선 많음

그래프의 종류

  • 무방향 그래프 vs 방향 그래프
    • 간선의 방향 유무
  • 가중치 그래프 : 간선에 비용이나 가중치가 할당되어 있음
  • 연결 그래프 vs 비연결 그래프
    • 무방향 그래프에서 어떤 정점에서든 다른 모든 정점에 경로가 있냐 없냐
  • Cycle vs Acyclic
    • 순환가능한가 안한가
    • DAG(Directed Acyclic Graphs) : 방향이 있고 순환이 없는 그래프 → 위상정렬 가능
  • 완전 그래프
    • 그래프에 속해 있는 모든 정점이 직접 연결되어 있는 그래프

그래프의 구현

  • 인접리스트 - 파이썬 딕셔너리 사용 or 이차원 배열 or 링크드 리스트 → 희소 그래프의 경우 (Sparse Graph)
  • 인접행렬 - n*n 배열로 생성 → 밀집그래프의 경우 (dense graph)

그래프의 탐색

DFS(깊이 우선 탐색)

깊게 깊게 → 재귀 or 스택으로 구현

BFS(너비 우선 탐색)

넓게 넓게 → 큐로 구현


🌳 트리 (Tree)

✅ 정의

트리는 그래프의 일종이지만, 특별한 조건을 만족해야 함:

  1. 사이클이 없음 (Cycle X)
  2. 모든 노드는 하나의 부모를 가짐
  3. 루트(Root)가 존재

📚 기본 용어

항목설명
루트 노드트리의 시작점 (예: A)
자식 노드부모로부터 연결된 노드
리프 노드자식이 없는 노드
서브트리트리의 일부분도 트리

트리의 탐색

전위 순회(preorder traversal)

root → left → right

중위 순회(inorder traversal)

left → root → right

후위 순회(postorder traversal)

left → right → root


그래프와 트리의 차이


위상 정렬(Topological Ordering)

  • DAG(Directed Acyclic Graph)(방향이 있고 순환이 없는 그래프)에서 node의 방향을 거스르지 않고 정렬

imapge.png

  • 위와 같은 경우 1 → 2 → 3로 위상 정렬된다.

🔁 위상 정렬 동작 방식 (Kahn’s Algorithm)

  1. 모든 노드의 진입 차수(in-degree) 계산
  2. 진입 차수가 0인 노드를 큐에 넣기
  3. 큐에서 꺼낸 노드를 결과에 추가
  4. 그 노드와 연결된 간선 제거 → 연결된 노드의 진입 차수 -1
  5. 진입 차수가 0이 되면 다시 큐에 넣기
  6. 큐가 빌 때까지 반복

추가적으로 알면 좋을 것들

  • 그래프 알고리즘

    • 최단거리 찾기
      - 다익스트라 알고리즘(양수 가중치에서 최단 거리 계산)
      - 벨만 - 포드 알고리즘 (음수 가중치 허용/ 최단 거리 계산)
      - 플로이드 워셜 알고리즘 (모든쌍의 최단거리 계산)

    • MST (Minimum Spanning Tree) - 가중치 합이 최소인 Spanning Tree(그래프의 최소 연결부분 그래프(필연적으로 트리 형태가 된다.))을 계산image.png

      • 크루스칼 알고리즘 (최소 신장 트리(MST) 만들기)
      • 프림 알고리즘 (MST 만들기)
    • SCC (Striong Connected Component) 강한 연결 요소 - 방향 그래프의 사이클 끼리 묶기


출처: https://gmlwjd9405.github.io/2018/08/13/data-structure-graph.html 참고

0개의 댓글