OPEN HYPER STEP
← 목록으로 (math)
MATH · 21 / 45
math
CHAPTER 21 / 45
읽기 약 2
FUNCTION

그래프 이론 기초: 노드와 간선


핵심 개념

그래프 = 노드(정점) + 간선(엣지). 방향/무방향, 가중치, 인접 행렬 vs 인접 리스트.

본문

그래프 표현

📋 코드 (6줄)
노드 (Node, Vertex): 점
간선 (Edge): 점들을 잇는 선

방향 그래프 (Directed):    A → B (한 방향)
무방향 그래프 (Undirected): A — B (양방향)
가중치 그래프 (Weighted):   A —[5]— B

인접 행렬 (Adjacency Matrix)

PYTHON📋 코드 (29줄)
# 5×5 행렬 — 노드 0~4
# matrix[i][j] = 1 이면 i→j 간선 존재

import numpy as np

# 무방향 그래프
matrix = np.array([
    # 0  1  2  3  4
    [0, 1, 1, 0, 0],  # 0 → 1, 2
    [1, 0, 0, 1, 0],  # 1 → 0, 3
    [1, 0, 0, 1, 1],  # 2 → 0, 3, 4
    [0, 1, 1, 0, 1],  # 3 → 1, 2, 4
    [0, 0, 1, 1, 0],  # 4 → 2, 3
])

# 무방향 그래프는 대칭 — matrix[i][j] == matrix[j][i]


# 0번 노드의 이웃 찾기 — O(V) (V=노드 수)
def neighbors_matrix(matrix, node):
    return [i for i, connected in enumerate(matrix[node]) if connected]


print(neighbors_matrix(matrix, 0))  # [1, 2]


# 공간: O(V²) — 노드 1만 개면 1억 원소
# 장점: 두 노드의 연결 여부 O(1) 확인
# 단점: 희소 그래프(간선 적음)에 메모리 낭비

인접 리스트 (Adjacency List)

PYTHON📋 코드 (32줄)
# 각 노드별 연결된 노드 목록만 저장

graph = {
    0: [1, 2],
    1: [0, 3],
    2: [0, 3, 4],
    3: [1, 2, 4],
    4: [2, 3],
}

# 0번 노드의 이웃 — O(1)
print(graph[0])  # [1, 2]


# 공간: O(V + E) — 간선 수만큼
# 장점: 희소 그래프에 효율적
# 단점: 두 노드 연결 여부 확인이 O(degree)


# 가중치 그래프
weighted_graph = {
    'A': [('B', 4), ('C', 2)],
    'B': [('A', 4), ('C', 1), ('D', 5)],
    'C': [('A', 2), ('B', 1), ('D', 8)],
    'D': [('B', 5), ('C', 8)],
}

# A의 이웃과 거리
for neighbor, weight in weighted_graph['A']:
    print(f"A → {neighbor}: {weight}")
# A → B: 4
# A → C: 2

실전 — 소셜 네트워크

PYTHON📋 코드 (22줄)
# 사용자 간 팔로우 관계 (방향 그래프)
follows = {
    'alice':   {'bob', 'charlie'},
    'bob':     {'alice'},                # 양방향
    'charlie': {'dave', 'eve'},
    'dave':    {'alice'},
    'eve':     {'alice', 'bob'},
}

# alice의 팔로워 (alice를 팔로우하는 사람)
def get_followers(graph, user):
    return {u for u, follows_set in graph.items() if user in follows_set}


print(get_followers(follows, 'alice'))  # {'bob', 'dave', 'eve'}

# alice가 팔로우하는 사람
print(follows['alice'])  # {'bob', 'charlie'}

# 상호 팔로우 (mutuals)
mutuals = follows['alice'] & get_followers(follows, 'alice')
print(mutuals)  # {'bob'}

실전 — 의존성 그래프

PYTHON📋 코드 (23줄)
# Node.js 패키지 의존성 그래프
deps = {
    'my-app': {'react', 'next'},
    'react':  {'react-dom'},
    'react-dom': set(),
    'next':   {'react', 'react-dom'},
}


# 모든 (직간접) 의존성 — DFS
def all_dependencies(graph, package, visited=None):
    if visited is None:
        visited = set()
    if package in visited:
        return visited
    visited.add(package)
    for dep in graph.get(package, []):
        all_dependencies(graph, dep, visited)
    return visited


print(all_dependencies(deps, 'my-app'))
# {'my-app', 'react', 'next', 'react-dom'}

실전 — React 컴포넌트 트리

PYTHON📋 코드 (29줄)
# React 컴포넌트는 트리 구조 (특수한 그래프)
component_tree = {
    'App': ['Header', 'Main', 'Footer'],
    'Header': ['Logo', 'Nav'],
    'Nav': ['NavItem1', 'NavItem2', 'NavItem3'],
    'Main': ['Article', 'Sidebar'],
    'Article': ['Title', 'Content'],
    'Sidebar': ['AdBox'],
    'Footer': [],
    'Logo': [], 'NavItem1': [], 'NavItem2': [], 'NavItem3': [],
    'Title': [], 'Content': [], 'AdBox': [],
}


def print_tree(graph, node, depth=0):
    print('  ' * depth + node)
    for child in graph.get(node, []):
        print_tree(graph, child, depth + 1)


print_tree(component_tree, 'App')
# App
#   Header
#     Logo
#     Nav
#       NavItem1
#       ...
#   Main
#     ...

다음 챕터

CH.22 "BFS와 DFS" — 그래프 탐색의 두 가지 핵심 알고리즘.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 시스템(파일/모듈/사용자)의 그래프
구조를 분석해서 인접 행렬 vs 리스트
어느 것이 적합한지 추천해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

한국 SNS 플랫폼의 그래프 데이터 구조와
팔로우/추천 알고리즘 비교를 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 코드베이스의 import 의존성 그래프를
분석해서 순환 참조 + 핵심 모듈
Top 10을 시각화해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 그래프 데이터베이스(Neo4j)
실전 활용 사례와 성능을 솔직히 알려줘.

⭐ 이것만 기억하세요
그래프 이론 기초: 노드와 간선 이 3가지만 확실히 잡으세요
1.그래프 = 노드 + 간선 — 소셜 네트워크·의존성·라우팅·트리 모두 같은 데이터 구조
2.인접 행렬 vs 인접 리스트 — 행렬은 빠른 연결 체크, 리스트는 메모리 효율 (희소 그래프)
3.다음 챕터 CH.22에서 BFS와 DFS — 그래프 탐색의 두 표준 알고리즘


공유하기
진행도 21 / 45