포스트

TIL 2026-03-13

TIL 2026-03-13

3/13 - 학습 정리 (챕터 3-8, 3-9)

생성일: 2026년 3월 13일 오후 5:18

챕터 3-8 그래프 개념 및 탐색

학습 목표

  • 그래프의 구성 요소(노드/간선/가중치)와 특징을 이해했다.
  • 인접 행렬과 인접 리스트의 구현 방식, 장단점, 성능 차이를 비교했다.
  • DFS/BFS의 동작 원리와 구현 방식(재귀/스택, 큐)을 정리했다.

핵심 개념 요약

  • 그래프는 정점(Vertex)과 간선(Edge)으로 이루어진 비선형 자료구조다.
  • 방향성: 방향 그래프 / 무방향 그래프
  • 가중치: 간선에 비용/거리 등의 값이 부여될 수 있다.
  • 순환 여부: 사이클 존재 여부에 따라 문제 풀이 접근이 달라진다.

표현 방식 비교

표현장점단점
인접 행렬간선 존재 확인이 빠름 O(1)메모리 O(V^2)로 큼
인접 리스트메모리 효율 좋음 O(V+E)간선 존재 확인은 느릴 수 있음
추천 상황정점 수 작고 밀집 그래프희소 그래프/일반 코테

탐색 알고리즘 요약

  • DFS: 깊게 우선 탐색. 재귀 또는 스택으로 구현.
  • BFS: 가까운 레벨부터 탐색. 큐(Queue)로 구현.
1
2
3
4
5
6
7
8
9
10
11
12
// DFS (재귀)
void dfs(int u){
  visited[u] = true;
  for(int v : graph[u]) if(!visited[v]) dfs(v);
}

// BFS
queue<int> q; q.push(start); visited[start]=true;
while(!q.empty()){
  int u=q.front(); q.pop();
  for(int v: graph[u]) if(!visited[v]){ visited[v]=true; q.push(v);} 
}

복잡도 감각

알고리즘복잡도비고
DFSO(V + E)인접 리스트 기준
BFSO(V + E)최단 거리(무가중치) 문제에 자주 사용
인접 행렬 탐색O(V^2)정점이 많을수록 비효율 가능

오늘 복기

  • 문제에서 그래프를 보면 먼저 “표현 방식”을 결정하는 것이 구현 난이도를 크게 좌우한다는 점을 느꼈다.
  • 탐색은 DFS/BFS 중 무엇이 맞는지보다, 방문 처리와 중복 방문 방지가 더 핵심이라는 점을 확인했다.

다음 액션

  • 인접 리스트 템플릿으로 DFS/BFS 기본 문제 1개씩 풀이
  • 인접 행렬/리스트 변환 연습으로 표현 방식 전환 감각 익히기

챕터 3-9 백트래킹

핵심 개념

  • 백트래킹은 완전탐색 중 유망하지 않은 분기를 조기에 제거(pruning)해 탐색량을 줄이는 기법이다.
  • 상태공간트리에서 부분 해답을 확장하다가 조건 위반 시 즉시 되돌아온다(backtrack).
  • 유망 함수(promising function)는 현재 경로가 해답으로 이어질 가능성을 판정한다.
  • 대표 문제: N-Queen, 부분집합 합, 스도쿠, 그래프 색칠(CSP).

동작 템플릿

1
2
3
4
5
6
7
8
9
void dfs(State cur){
  if (종료조건) { 정답 처리; return; }
  for (후보 c : 후보집합){
    if (!promising(cur, c)) continue; // 가지치기
    선택 적용
    dfs(다음 상태);
    선택 복구; // backtrack
  }
}

시간복잡도 감각

  • 최악에는 여전히 지수적일 수 있지만, 유망 함수 품질이 좋을수록 체감 성능이 크게 개선된다.
  • 핵심은 탐색 자체보다 “언제 버릴지”를 빠르게 결정하는 데 있다.

오늘 복기

  • 백트래킹을 단순 DFS가 아니라 “제약 기반 탐색 최적화”로 이해했다.
  • 후보 생성보다 가지치기 조건을 먼저 설계해야 성능이 올라간다는 점을 확인했다.

다음 액션

  • 부분집합 합 문제를 pruning 유/무 2버전으로 구현해 실행 횟수 비교
  • N-Queen 충돌 판정(열/대각선)을 함수로 분리해 템플릿화
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.