소스에서 타깃까지의 모든 경로: 코딩 문제

발행: (2026년 2월 2일 오후 03:20 GMT+9)
8 분 소요
원문: Dev.to

I’m ready to translate the article, but I don’t see the text you’d like me to work on—only the source link is provided. Could you please paste the content you want translated (excluding any code blocks or URLs you’d like to keep unchanged)? Once I have the text, I’ll translate it into Korean while preserving the original formatting.

문제 개요

“시작 노드에서 목표 노드까지 모든 가능한 경로” 문제는 방향 그래프에서 시작 노드와 목적지 노드 사이의 모든 가능한 경로를 찾도록 요구합니다.
그래프는 일반적으로 인접 리스트 형태로 제공되며, 각 노드는 직접 도달할 수 있는 이웃 노드들의 리스트를 가리킵니다. 여러분의 작업은 시작 노드에서 시작해 목표 노드에서 끝나는 모든 유효한 경로를 반환하는 것이며, 각 경로는 방문 순서대로 노드들의 시퀀스로 나열됩니다.

이 문제는 최단 경로를 찾거나 단순히 도달 가능성을 판단하는 것이 아니라, 명시적으로 모든 경로를 열거하는 것입니다.
여러분은 모든 유효한 경로를 생성해야 하며, 이는 해결 방법의 성격을 완전히 바꿉니다. 거리 최적화 대신 가능한 경우의 탐색 공간을 탐색하게 됩니다.

Why Not BFS

  • **Breadth‑first search (BFS)**는 거리 레이어별로 탐색하기 때문에 가중치가 없는 그래프에서 최단 경로를 찾고자 할 때 탁월합니다.
  • 여기서는 거리가 목표가 아니며, 레벨별 탐색이 의미 있는 이점을 제공하지 않습니다.
  • BFS는 한 번에 많은 부분 경로를 저장해야 하는 경향이 있어 메모리 사용량이 크게 증가합니다. 경로 열거만으로도 이미 많은 후보가 생성될 수 있기 때문에 일반적으로 메모리를 제어할 수 있는 접근 방식을 선호합니다.

Source:

백트래킹을 이용한 DFS

깊이 우선 탐색(DFS)은 한 경로를 끝까지 탐색한 뒤 다음 경로로 이동하기 때문에 이 문제에 자연스럽게 맞습니다.

  1. 시작점에서 시작합니다.
  2. 인접한 정점을 선택하고 앞으로 진행하며, 목표에 도달하거나 더 이상 이동할 수 없을 때까지 계속합니다.
  3. 목표에 도달하면 현재 경로를 하나의 유효한 답으로 기록합니다.
  4. 막다른 길에 이르면 백트래킹하여 다른 인접 정점을 시도합니다.

백트래킹 메커니즘

  • 그래프를 탐색하면서 현재 경로 리스트를 유지합니다.
  • 인접 정점을 선택할 때는 추가하고,
  • 그 선택을 탐색한 뒤 되돌아올 때는 제거합니다.

이렇게 하면 경로 리스트가 현재 탐색 중인 경로만을 정확히 나타내게 되며, 매 단계마다 별도의 복사본을 만들 필요가 없어 알고리즘이 더 깔끔하고 효율적입니다. 또한 이전 탐색에서의 잔여 데이터가 우연히 섞이는 일을 방지하여 체계적인 경로 생성이 보장됩니다.

사이클 처리

일반적인 방향 그래프에서는 노드를 다시 방문하는 것이 허용되면 사이클이 무한히 많은 경로를 만들 수 있습니다. 이 문제의 많은 변형은 암묵적으로 **방향 비순환 그래프(DAG)**를 사용하여 사이클 위험을 제거하고 유한한 경로 집합을 보장합니다.

사이클이 가능한 경우:

  • 같은 경로 탐색 중에 노드를 다시 방문하지 않도록 현재 재귀 스택 내의 방문 제약을 사용합니다.
  • 전역 방문 집합을 사용하지 마세요. 이는 다른 경로에서 노드를 다시 방문하는 유효한 경로를 잘못 제거하게 됩니다.

복잡도 분석

  • 시간 복잡도는 실제로 모든 경로를 출력해야 하므로 경로의 수와 길이에 의해 좌우됩니다. 조밀한 비순환 그래프에서는 경로 수가 기하급수적으로 증가할 수 있으며, 출력 자체가 기하급수적일 때 이를 피할 수 있는 알고리즘은 없습니다.
  • 공간 복잡도는 재귀 깊이와 현재 구축 중인 경로에 의해 결정되며, 최장 경로의 길이에 비례합니다. 출력 경로를 저장하기 위한 추가 공간도 필요하며, 이는 피할 수 없습니다.

왜 이 문제는 유용한가

  • 후보자가 단일 해를 찾는 것과 모든 해를 열거하는 것의 차이를 이해했는지 테스트합니다.
  • 백트래킹 기본 원칙을 확인합니다. 예를 들어, 가변 상태를 안전하게 유지하고 변경을 올바르게 되돌리는 것 등.
  • 출력 크기가 실행 시간을 좌우한다는 것을 인식하는 것은 알고리즘적 성숙도를 보여줍니다.
  • “백트래킹을 이용한 DFS” 패턴은 그래프 탐색을 넘어 조합론, 제약 만족 문제 및 기타 재귀적 열거 작업까지 확장됩니다.

DFS가 왜 선호되는지, 백트래킹이 현재 경로를 어떻게 유지하는지, 그리고 유효한 경로를 놓치지 않으면서 사이클을 어떻게 처리해야 하는지를 명확히 설명할 수 있는 능력은 강력한 알고리즘적 사고를 보여주며, 이 문제를 체계적인 열거와 재귀적 탐색을 연습하기에 훌륭한 과제로 만듭니다.

Back to Blog

관련 글

더 보기 »

SnapPoint: Dev Machine를 위한 Hard Reset

대부분의 개발자 머신은 깨끗하지 않습니다. 겉보기만 깨끗해 보일 뿐입니다. 어느 시점에서 모든 개발자 노트북은 쓰레기장이 됩니다. 블로그를 따라가기 위해 툴을 설치하고…