코딩 교훈 기록
DFS에서 max_value를 이용한 가지치기
Disciple428
2025. 4. 20. 02:12
🔍 요약: DFS에서 max_value를 이용한 가지치기란?
지금까지 더한 값 + 앞으로 더해질 수 있는 최대값이 현재의 최대 결과값(max_value)보다 작으면
더 이상 탐색해도 의미가 없으므로 중단한다.
📌 언제 쓰이는가?
테트로미노 문제처럼
- DFS로 블록 4개를 이어붙여 합을 계산하고,
- 최대값을 찾아야 하는 문제에서 사용됨.
💡 가지치기 핵심 로직
if current_sum + remain_max * (4 - depth) <= max_value:
return
- current_sum: 지금까지 누적한 값
- remain_max: 아직 탐색하지 않은 칸 중 가장 큰 숫자
- 4 - depth: 앞으로 몇 개 더 선택해야 하는지
- max_value: 지금까지 구한 최고값
즉, 최선의 경우를 가정해도 max_value를 넘을 수 없다면 더 탐색하지 않음.
✅ 예시 코드 조각
def dfs(x, y, depth, total):
global max_value
# 가지치기: 최적의 경우에도 max_value를 넘을 수 없으면 중단
if total + max_cell * (4 - depth) <= max_value:
return
if depth == 4:
max_value = max(max_value, total)
return
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny]:
visited[nx][ny] = True
dfs(nx, ny, depth + 1, total + board[nx][ny])
visited[nx][ny] = False
- 여기서 max_cell은 전체 보드에서 가장 큰 값으로, 미리 계산해둔다.
max_cell = max(map(max, board))
🎯 효과
- 시간 복잡도 대폭 절감
- 불필요한 백트래킹 방지
- 탐색 깊이 4개 제한이 있어도 브루트포스로는 어려운 케이스 해결 가능
✅ 정리
항목 | 내용 |
이름 | DFS 가지치기 (Pruning) |
조건 | 현재값 + 앞으로 가능한 최대값 <= max_value |
효과 | 시간 단축, 불필요한 탐색 제거 |
사용 예 | 테트로미노, 경로 최대합, 백트래킹 최적화 |