{"componentChunkName":"component---src-templates-blog-post-js","path":"/algorithm/깊이우선탐색-depth-first-search/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"ef264ccc-c32b-5769-8da4-8de9c8f897ee","excerpt":"깊이 우선 탐색 (DFS) DFS…","html":"<p><img src=\"/assets/algorithm.png\" alt=\"깊이 우선 탐색 (DFS)\" title=\"깊이 우선 탐색 (DFS)\"></p>\n<p>DFS는 분기 깊이를 우선하여 탐색하는 방식으로, 백트래킹과 조합 탐색에 자주 쓰인다.</p>\n<h2 id=\"정의\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EC%9D%98\" aria-label=\"정의 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정의</h2>\n<p>한 갈래를 선택해 끝까지 내려가 본 뒤, 더 갈 곳이 없으면 한 단계씩 되돌아와 다른 갈래를 탐색하는 방식이다. 미로를 손가락으로 짚고 한 길을 끝까지 따라간 뒤 막히면 되돌아와 다른 길을 시도하는 것과 같다. 이 특성 덕분에 모든 조합이나 경로를 체계적으로 나열·검사해야 하는 백트래킹 문제에 매우 잘 맞는다.</p>\n<h2 id=\"구현\" style=\"position:relative;\"><a href=\"#%EA%B5%AC%ED%98%84\" aria-label=\"구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>구현</h2>\n<p>재귀 함수를 이용하면 간결하게 구현된다. 현재 정점을 방문으로 표시하고, 인접한 정점들 중 아직 방문하지 않은 곳이 있으면 그쪽으로 재귀 호출을 내려 보낸다. 호출이 끝나면 자동으로 한 단계 위로 되돌아오므로, 자연스럽게 “내려가기→되돌아오기” 흐름을 코드로 표현할 수 있다.</p>\n<p>스택으로도 동일한 동작을 흉내 낼 수 있는데, 이때는 스택에 다음 방문 후보를 쌓고 하나씩 꺼내며 방문한다. 인접 순서에 따라 방문 결과가 달라질 수 있으므로, 특정 순서를 보장하려면 인접 리스트를 정렬하거나 정해진 순서대로 순회하는 규칙을 두는 것이 좋다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">dfsOrder</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">graph<span class=\"token punctuation\">,</span> start</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> n <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span>length\n  <span class=\"token keyword\">const</span> visited <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Array</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> order <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">dfs</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">u</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    visited<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n    order<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>u<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> v <span class=\"token keyword\">of</span> graph<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>visited<span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token function\">dfs</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">dfs</span><span class=\"token punctuation\">(</span>start<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> order\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 예시: 0-1-2, 1-3 구조 (인접 순서에 따라 결과가 달라질 수 있음)</span>\n<span class=\"token keyword\">const</span> graph <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>       <span class=\"token comment\">// 0</span>\n  <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 1</span>\n  <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>       <span class=\"token comment\">// 2</span>\n  <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>       <span class=\"token comment\">// 3</span>\n<span class=\"token punctuation\">]</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">dfsOrder</span><span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// [0,1,2,3] 또는 [0,1,3,2]</span></code></pre></div>\n<h2 id=\"데모\" style=\"position:relative;\"><a href=\"#%EB%8D%B0%EB%AA%A8\" aria-label=\"데모 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>데모</h2>\n<p><a href=\"https://codepen.io/pen/?template=yLgbWPj\">https://codepen.io/pen/?template=yLgbWPj</a></p>","tableOfContents":"<ul>\n<li><a href=\"/algorithm/%EA%B9%8A%EC%9D%B4%EC%9A%B0%EC%84%A0%ED%83%90%EC%83%89-depth-first-search/#%EC%A0%95%EC%9D%98\">정의</a></li>\n<li><a href=\"/algorithm/%EA%B9%8A%EC%9D%B4%EC%9A%B0%EC%84%A0%ED%83%90%EC%83%89-depth-first-search/#%EA%B5%AC%ED%98%84\">구현</a></li>\n<li><a href=\"/algorithm/%EA%B9%8A%EC%9D%B4%EC%9A%B0%EC%84%A0%ED%83%90%EC%83%89-depth-first-search/#%EB%8D%B0%EB%AA%A8\">데모</a></li>\n</ul>","wordCount":{"words":143},"fields":{"slug":"/algorithm/깊이우선탐색-depth-first-search/","image":"/assets/algorithm.png","faq":[]},"frontmatter":{"title":"깊이 우선 탐색 (Depth-First Search, DFS)","date":"2025년 10월 30일","dateISO":"2025-10-30T00:00:00.000Z","updatedISO":null,"category":"algorithm","description":"그래프에서 한 경로를 가능한 깊게 따라간 뒤, 더 갈 곳이 없으면 되돌아오는 탐색 방법. 재귀 또는 스택을 사용하며, 연결 요소 탐색과 위상 정렬 등에 활용된다.","tags":["깊이 우선 탐색","Depth-First Search","DFS","알고리즘","Algorithm","JavaScript"]}}},"pageContext":{"slug":"/algorithm/깊이우선탐색-depth-first-search/","previous":{"fields":{"slug":"/algorithm/다익스트라-dijkstra/"},"frontmatter":{"title":"다익스트라 알고리즘 (Dijkstra)","tags":["다익스트라","Dijkstra","최단 경로","알고리즘","Algorithm","JavaScript"]}},"next":{"fields":{"slug":"/algorithm/트리-순회-tree-traversal/"},"frontmatter":{"title":"트리 순회 (Tree Traversal)","tags":["트리 순회","Tree Traversal","전위 순회","중위 순회","후위 순회","알고리즘","Algorithm","JavaScript"]}}}},"staticQueryHashes":["213619243","3262363727"]}