{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm-Analysis/2020-04-25-알고리즘-DFS/","result":{"data":{"site":{"siteMetadata":{"title":"Hun's Footsteps 🥷","author":"전여훈","siteUrl":"https://jeonyeohun.netlify.app","comment":{"disqusShortName":"","utterances":"jeonyeohun/jeonyeohun.github.io"},"sponsor":{"buyMeACoffeeId":"jeonyeohun"}}},"markdownRemark":{"id":"e481a00b-584a-5891-946c-8c94bb3bcacc","excerpt":"Depth First Search DFS는 그래프를 순회하기 위해 사용하는 알고리즘 전략으로, 한 노드로부터 시작해서 자식노드를 계속 따라가며 더 이상 자식노드가 나타나지 않을 때까지 진행하고 더 이상 자녀가 없을 때는 왔던 길을 다시 거슬러 올라가며 탐색하지 않은 다른 노드들을 같은 방법으로 순회하는 알고리즘이다. Algorithm Steps DFS…","html":"<h1 id=\"depth-first-search\" style=\"position:relative;\"><a href=\"#depth-first-search\" aria-label=\"depth first search permalink\" class=\"anchor 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>Depth First Search</h1>\n<p>DFS는 그래프를 순회하기 위해 사용하는 알고리즘 전략으로, 한 노드로부터 시작해서 자식노드를 계속 따라가며 더 이상 자식노드가 나타나지 않을 때까지 진행하고 더 이상 자녀가 없을 때는 왔던 길을 다시 거슬러 올라가며 탐색하지 않은 다른 노드들을 같은 방법으로 순회하는 알고리즘이다.</p>\n<h2 id=\"algorithm-steps\" style=\"position:relative;\"><a href=\"#algorithm-steps\" aria-label=\"algorithm steps permalink\" class=\"anchor 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>Algorithm Steps</h2>\n<p>DFS 를 적용하기 위한 다양한 방법이 있지만 강의에서 소개된 방법은 색깔을 통해 각 노드의 상태를 표현하고, 해당 노드가 발견된 시간(실제 시간을 기록하진 않는다), 탐색이 끝난 시간을 기록하는 방법으로 노드들을 순회한다.</p>\n<h3 id=\"node-state\" style=\"position:relative;\"><a href=\"#node-state\" aria-label=\"node state permalink\" class=\"anchor 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>Node State</h3>\n<p>DFS가 탐색할 각 노드 혹은 vertex 는 다음 세개 중 하나의 색깔로 상태를 나타낸다.</p>\n<ol>\n<li>White : 아직 발견되지 않은 노드</li>\n<li>Gray : 발견은 되었지만 아직 해당 노드의 모든 자식과 자손 노드들을 탐색하지 않은 노드</li>\n<li>Black : 해당 노드로 부터 파생된 모든 자손 노드들의 탐색이 끝난 노드</li>\n</ol>\n<p>가장 초기에는 대상이 되는 그래프의 모든 노드들이 흰색으로 초기화 되어 있을 것이다.</p>\n<h3 id=\"timestamp\" style=\"position:relative;\"><a href=\"#timestamp\" aria-label=\"timestamp permalink\" class=\"anchor 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>Timestamp</h3>\n<p>각 노드들은 색깔과 더불어서 두 종류의 timestamp를 가지게 된다. 여기서 timestamp는 실제 시간이 아니라 처리가 끝난 순서를 기록하게 된다.</p>\n<ol>\n<li>d[v] : discorvery time. 어떤 노드가 발견된 시간, 즉 color 상태가 white 이었다가 gray 가 된 순간을 기록한다.</li>\n<li>f[v] : finish time. 어떤 노드의 하위 노드들의 탐색이 모두 끝나고 해당 노드로 다시 돌아온 시간 즉 color 상태가 gray에서 black이 된 순간을 기록한다.</li>\n</ol>\n<p>따라서 어떤 노드 v에 대해서 d[v]는 항상 f[v] 보다 작은 값을 가지고 있어야 한다.</p>\n<h3 id=\"pseudo-code\" style=\"position:relative;\"><a href=\"#pseudo-code\" aria-label=\"pseudo code permalink\" class=\"anchor 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>Pseudo Code</h3>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token function\">DFS</span><span class=\"token punctuation\">(</span>V<span class=\"token punctuation\">,</span> E<span class=\"token punctuation\">)</span>\n<span class=\"token number\">1</span> <span class=\"token keyword\">for</span> each u in V\n<span class=\"token number\">2</span>   <span class=\"token keyword\">do</span> color<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> white\n<span class=\"token number\">3</span> time <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n<span class=\"token number\">4</span> <span class=\"token keyword\">for</span> each u in V\n<span class=\"token number\">5</span>   <span class=\"token keyword\">do</span> <span class=\"token keyword\">if</span> color<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> white\n<span class=\"token number\">6</span>     then DFS<span class=\"token operator\">-</span><span class=\"token function\">VISIT</span><span class=\"token punctuation\">(</span>u<span class=\"token punctuation\">)</span></code></pre></div>\n<p>위 pseudo code 는 DFS를 시작하는 노드이다. 어떤 그래프 안에 노드들이 연결되어 있지 않을 수도 있기 때문에 여러개의 트리를 DFS로 각각 탐색해야하는 경우가 있을 수도 있다. 1~2 번째 라인에서는 주어진 그래프 내에 있는 모든 노드들을 하나씩 꺼내서 그 색깔을 흰색으로 초기화 해준다. 그리고 3번째 라인에서는 전역변수로 사용되는 time 변수를 0으로 초기화해준다. 이 변수는 timestamp를 계속해서 기록하는데 사용하게 된다.</p>\n<p>4 ~ 6째 라인에서는 각 노드들을 기준으로 트리를 만드려는 시도를 하게 되는데, 만약 모든 노드들이 다 연결되어 있다면, 트리가 만들어진 이후에 색깔이 검은색으로 변경된 상태일 것이기 때문에 더 이상 반복하지 않게된다. 만약 모든 노드들이 연결되어 있지 않다면 흰색으로 남아있는 노드가 존재한다는 것이기 때문에 새로운 트리를 만드는 시도를 반복적으로 할 수 있게 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\">DFS<span class=\"token operator\">-</span><span class=\"token function\">VISIT</span><span class=\"token punctuation\">(</span>u<span class=\"token punctuation\">)</span>\n<span class=\"token number\">1</span> color<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> gray\n<span class=\"token number\">2</span> time <span class=\"token operator\">=</span> time <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n<span class=\"token number\">3</span> d<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> time\n\n<span class=\"token number\">4</span> <span class=\"token keyword\">for</span> each v in adj<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span>\n<span class=\"token number\">5</span>   <span class=\"token keyword\">do</span> <span class=\"token keyword\">if</span> color<span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> white\n<span class=\"token number\">6</span>     then DFS<span class=\"token operator\">-</span><span class=\"token function\">VISIT</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span>\n<span class=\"token number\">7</span> color<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> black\n\n<span class=\"token number\">8</span> time <span class=\"token operator\">=</span> time <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n<span class=\"token number\">9</span> f<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> time</code></pre></div>\n<p>이 함수는 시작함수로부터 전달된 시작점이 될 노드부터 트리를 만들기 시작한다. 1 ~ 3 번째 라인에서는 노드를 방문했기 때문에 일단 색깔을 gray로 변경시키고 discovery time을 기록한다. 그리고 해당노드의 adjacency list, 즉 해당 노드와 연결되어 있는 노드를 하나씩 꺼내보고 만약 그 노드가 아직 방문 되지 않은 노드라면 그 노드를 시작점으로 재귀적으로 같은 작업을 반복한다. 이렇게 하면 초기 시작 노드로부터 더 이상 자녀노드가 없을 때까지 반복적으로 노드들을 체크해줄 수 있을 것이다.</p>\n<h3 id=\"example\" style=\"position:relative;\"><a href=\"#example\" aria-label=\"example permalink\" class=\"anchor 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>Example</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA9ElEQVQoz3WRB47DMAwE8/+P2nCFezeDIbKCrPMRYGKQ2mH72M/mebZ1XS21+75tmibbts3eDA1a2YefYRg8MY6ji8/zdD+Ow7qu8xxvECrOf9/3/n5ZFs8HIAk6ua7L6roO4rIsraqqAOGbojiaLMs8jqOB4UAeEKCbfd8fI0lMDmFsFMQ1mXcIVUIFicnfcloTcRqICwUgS9dRUiBx5ViL9poeL4zMR1EUvqPUAOR5bm3bBpg6igureDgKHepaOgIx7ZUjURBoPHoMewAR4VyZ3QBomsZd8HSPMegBRKxrppd8y6Vd/QFijBmPE4sApaP+Z1+DzV/ybVGEtwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"1\"\n        title=\"1\"\n        src=\"/static/1c11f1a2d891bb8898d50a14993eef44/d9217/1.png\"\n        srcset=\"/static/1c11f1a2d891bb8898d50a14993eef44/5a46d/1.png 300w,\n/static/1c11f1a2d891bb8898d50a14993eef44/0a47e/1.png 600w,\n/static/1c11f1a2d891bb8898d50a14993eef44/d9217/1.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>위 와 같은 그래프가 있다고 하자. 만약 초기 노드로 1번 노드를 선택하고 dfs를 시작한다면,</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABFElEQVQoz3WSyYqGMBCEff93EgTBg3jyLHgRBAX3feuZr4f+cRynIZp0VSrVnTjyHWVZSpqmMs+zPGMcR+n7XtZ1/YNt26YYnOu6NOfUdS1BEIjv+xLHsW5kQK6qSsmsu66TaZo0b0JN0ygGB0wFi6IQ13XF8zwJw1CGYVAQt3mey7Issu+75hEgz+AwzCDOGlEVxGqSJBJFkZKegTOEbMO93CzLNA/nOI4fQT6IWv+Y34eJGkZQAbk7x3AVpCTsPwVtfXdO6YxnfC6FSdu22q+3m8QJGBVwEdb856EWDj2ATA8Qtk3keE782UAfzdl/Yh9Bew64QcCeBm0A46bh0Zq3tvwSPM9TT8bZ28Mmf8feRO7xBcOhC1D5Zm43AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"2\"\n        title=\"2\"\n        src=\"/static/88341cb94e78e57208af19ea905db665/d9217/2.png\"\n        srcset=\"/static/88341cb94e78e57208af19ea905db665/5a46d/2.png 300w,\n/static/88341cb94e78e57208af19ea905db665/0a47e/2.png 600w,\n/static/88341cb94e78e57208af19ea905db665/d9217/2.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>다음과 같이 시작노드를 gray 로 색칠하고 discover time을 1로 설정하게 된다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGUlEQVQoz31SyYqFQAz0///Ig6J4FsWzehJFxX1fM1MZItLzZgKB2NWpVKXV6DuyLKMwDGmeZ1LjP2xdVxqGgaZpovu++Uwry5IcxyHbtikIAtq2jfM8T0qShDHTNBkDAbB935mo6zquQSgDtTzPyTAMsiyLXNdlEInGKIqYTNd18jyPSdC4LAtVVcV5HAefoYcJITWOY/J9n/q+/2VLMKhR7aZpykQYdF3XD6FcwFQEBkjKN5qlRozjyPk+k5oJsQfI/0QI63VdP01wIft6D30eBVLbtiXsEs1qACuKgklg7a32TfgoxA5gF6+KPb0XDyIQCKYqU2tWKE8OdbADIvk1mqZ5MOwMxKo6NdgyLkPZJ8uCqQ/zV3wBVjAGfN3gAqwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"3\"\n        title=\"3\"\n        src=\"/static/1b39a23d308bad9c49d3bacc11b3c85a/d9217/3.png\"\n        srcset=\"/static/1b39a23d308bad9c49d3bacc11b3c85a/5a46d/3.png 300w,\n/static/1b39a23d308bad9c49d3bacc11b3c85a/0a47e/3.png 600w,\n/static/1b39a23d308bad9c49d3bacc11b3c85a/d9217/3.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>이제 1번 노드와 연결된 2번노드를 선택해서 재귀적으로 같은 작업을 수행한다. 2번노드가 흰색이므로 회색으로 색칠하고, discover 시간을 1 올려서 2로 표시해준다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABK0lEQVQoz31SSY6DQAzk/z9CCAiCG0JwyoUDCgdALIIQliQszpRHHnXIzJTULO1y2a5ujb6Q5znFcUzDMNARRVH8GRvHkWPIB/Z9J61pGvI8j06nE4VhSPf7nR6PB63rSlmWkeu6ZJomRVFE8zxz7Pl8cgHwLctiDnQAra5r3nQch3zf56pYEE6ShGzbJl3XKQgC6vuepmli4bZtuRHDMDi/qqpvQTwulwt3cL1eP8ZK05RjXde97aNL5J3PZ+Zg3B9BAFXFB3UB6EpiAMa93W4fxdlDqSYeHMW2bSPYIoCQWuDI15CAUcuyZN+OkBh8hZhwVBH1rYGIcSEM06UD7EkRiYGrChy/uUMkg4jrgCT1auAkEcc/fFuW5Vdb3gSxKeMg8Qg5AHXU//ACo3kBsS4t1EQAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"4\"\n        title=\"4\"\n        src=\"/static/64835f51abfa721997f76e3b0dd46314/d9217/4.png\"\n        srcset=\"/static/64835f51abfa721997f76e3b0dd46314/5a46d/4.png 300w,\n/static/64835f51abfa721997f76e3b0dd46314/0a47e/4.png 600w,\n/static/64835f51abfa721997f76e3b0dd46314/d9217/4.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABQUlEQVQoz31SS66CQBCchPNxBZacwwt4Cz0AWxIIiQmauIANG9YYgmiiqHz8UL7qlyEEfa+ShqGbqa7qGYUflGWJNE1xPp8xha6dTqch1/e9vPn/bDbDYrEY8qqqKoRhiCAIsN1uUdc1uq7D4/EQMtY8z5Pa9XrF/X5H0zRCYFkWlFISjuNITrHzarWC7/vYbDZgA5K2bYvdbieNXNfFer0WlSQj8fP5hGmaMAxDCJfL5S8hH1mWIY5jHI/HD8t5niOKIhwOh49akiSwbRvz+XzIKe1d2+B6HAQVj2fH72/zlhlywblodVNCBmepQbsM4vV6yaxpXzdT+rT2+/2gZIzL5YKiKISE6/+ciMLb7SY/sRs36UNhjnNjnQqY18qmJGMobuQm2tZkXDOonCS8RvrKTNVNIZZJOLYzBht8s/oX3u3y8EEgY2SoAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"5\"\n        title=\"5\"\n        src=\"/static/b542998c3de102f006a7d5d8ee1c6e35/d9217/5.png\"\n        srcset=\"/static/b542998c3de102f006a7d5d8ee1c6e35/5a46d/5.png 300w,\n/static/b542998c3de102f006a7d5d8ee1c6e35/0a47e/5.png 600w,\n/static/b542998c3de102f006a7d5d8ee1c6e35/d9217/5.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>같은 작업을 계속 진행하면 3번 노드는 이제 더 이상 갈 곳이 없으므로 black 으로 칠하게 되고 backtrack 을 통해서 부모노드로 다시 올라간다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABPElEQVQoz31SW66CMBTsWv3ygw34zyIMC2APJHwQY+QH2QHE8IMJoPJQeTreqWnj9XKd5NDTlk5nzqnAD5qmQRRFKIoCn7her4jjGHmeYw62bcOyLIzjKOdimiaEYYjNZgPf93E6nTAMA/q+R13X2O/38DwPu91O7/ESYr1eQwghwzTNFyGZSeS6LrbbLdI0Rdu2uN/vUhWJHMeRpMfjUe6VZSkPr1YrTbhcLl+E/GRZhiAIcDgc/lgi6X97SZLAMAwsFgt5mSR8PB4yoSKVc1RB3G43vU7Q9uVy0XMFlk8Tsj6s2xwhm6VyZVnNWTIGybRlqqNkVZt3cI915UugUjZK4d2RgqB8/sRbeJhKOaqc1qiKnT2fz1/JdJdJSLs8VFWVzNWzISHVc+y67ivZL8s8TFtzlrnO+GzaHJ7VEO//a7r8NwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"6\"\n        title=\"6\"\n        src=\"/static/26781a509147955c74efeabf6fdbd995/d9217/6.png\"\n        srcset=\"/static/26781a509147955c74efeabf6fdbd995/5a46d/6.png 300w,\n/static/26781a509147955c74efeabf6fdbd995/0a47e/6.png 600w,\n/static/26781a509147955c74efeabf6fdbd995/d9217/6.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>리턴된 이후에 2번 노드에 대한 자식노드가 아직 adjacency node 남아있는 상태이기 때문에 5번 노드로 이동한다. 이런 과정을 계속해서 반복하게 되면 다음과 같이 그래프가 완성된다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABVklEQVQoz4VSu66CQBBd+AoLo79EZ2lD4V/Y+SM29HTGAiOJ8VH4ByqaYAEBfGvUc++Zm/UimHiSYTYzs2c4M6vwi91uh8ViIb6I/X6P5XL5MUd0u124rivn5/MJdblcMJ1OMRwOMZvNhOB2u4klSSI5z/PE69zpdBKCdrsNpZSY4zgSUyzyfR/9fh+j0QhRFOF8PoONwjDEYDBAr9cTH8exxHmHaDQaME1TCDudzh8hP0EQYDKZYLPZlCQxxtx6vS7l5vM5LMtCq9VClmX/hNSuZfCcNz1jnSP0OIqQGfJwv99fBXmyx+NRukTJ+Qa8S9PNhPBwOMi8jsfjWzdiPB6j2WzKfBnLb1vX5L3iAiiXXUiYpql4ylqtVqjVajAMA5VKRWZN8M+LZBovQhKQiBu8Xq9SyEXU63XZYrVaxXa7fRF+InuTTCL6ohy+T9u25S1+IyN+AJgS2lpcyNEpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"7\"\n        title=\"7\"\n        src=\"/static/1812bb9534a0ac75903fbcd982aba8ce/d9217/7.png\"\n        srcset=\"/static/1812bb9534a0ac75903fbcd982aba8ce/5a46d/7.png 300w,\n/static/1812bb9534a0ac75903fbcd982aba8ce/0a47e/7.png 600w,\n/static/1812bb9534a0ac75903fbcd982aba8ce/d9217/7.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABbUlEQVQoz3VSOarCUBR9aKOlpRBcgK270MIt6DZcgGQhNkIqbUXQRkFBFCzEFII2ggYT5/H8f+7nPRL1H7gZ7nDuqPCLzWaD+XyOIAig8Xq95D0cDlGpVDCdTiN6Yr/fo1qtol6vG5siSa/XQ6fTwWAwwOl0wuVyEeNisYBlWVBKIZvNwvM8PB4P8SHK5bLYKM1mU3Rqt9uh2+2i3W6j3+9LlcfjEc/nE+PxGKlUColEQohXqxVut5tURuJCoYB4PC6EtVrtj5CP5XKJ0Wgkrb+33Gg0UCwW0Wq1PlqeTCYolUqwbdvolXY6n88mQAurDEP/09f3fbxDZsiP+/2O7Xb7QaizXq9XE3Q4HER0ArZOiVTIbOv12gw7DMdxkM/nZc4M1GTfEkuFXABbYDYOWy+FRi6FC0kmk8hkMmbG9A2ThKFIRgK9PX02hOu6SKfTiMViyOVykTl/IzMtk5BkOiDszBvlYc9ms8hi/sMPn4zJXPuml8EAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"8\"\n        title=\"8\"\n        src=\"/static/d601ee11a043aaf7c6dbfeb39008a6b5/d9217/8.png\"\n        srcset=\"/static/d601ee11a043aaf7c6dbfeb39008a6b5/5a46d/8.png 300w,\n/static/d601ee11a043aaf7c6dbfeb39008a6b5/0a47e/8.png 600w,\n/static/d601ee11a043aaf7c6dbfeb39008a6b5/d9217/8.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVQoz21Su6rCUBCMD7DwX6wF+/yAjUXADxD/wE5/wNo2jWARsQ6CQZSgQsoUIkqihYLGV8TXeHfl5EbNwMmyu+cMO7OR8Ifz+YzZbIbNZoNv7Pd71Ot19Ho9REHTNDQaDdxuN86l5/MJy7JgGAYGgwGTUtP3fb6Qz+chSRLS6TRM0+Ta8XjkqKoq4vE49yuVypvw8XhgOBxC13WewnVdXC4XnE4njplMhsnoUbvd5kfb7ZZjtVrleiwWg6Iob0L60FSj0QjT6TSQQpMTJpMJZFlGrVb7kes4DkqlEgqFAubz+b9k4SNNK8johPMwyJLdbhf0BSgPCMn8+/0eSSjqhOv1Cs/zPnp0RM6SD4cDxuMxFovFj2SyoVgsotlsco3Ivu+IAYKlEBktpN/vY7VaBUuhTWezWSQSCTaf/gQhLUwWBkumhXQ6HXS7XazXa/aISCnmcjkkk0mkUqngtwlb8w2WTDJs28ZyuYyUXC6X0Wq1PqaLIiO8AFf8xIjZOrzbAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"9\"\n        title=\"9\"\n        src=\"/static/759a3fb5f58f666bf3fb2eefc3a77b03/d9217/9.png\"\n        srcset=\"/static/759a3fb5f58f666bf3fb2eefc3a77b03/5a46d/9.png 300w,\n/static/759a3fb5f58f666bf3fb2eefc3a77b03/0a47e/9.png 600w,\n/static/759a3fb5f58f666bf3fb2eefc3a77b03/d9217/9.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABiElEQVQoz4VSO6rCQBQNgkgQsRBXIAgiZAfJQmzcgRbuQBRrwcZFCLGzCSlEESvTqCGgYiPiBwU/+D2+e2Xy8pLiHZgZZu7cc++ZMxJ+sN1uYds2drsdBN7vN6+j0QiFQgHdbvfPOeFyuaBcLqPRaLhnEh0OBgOYponhcIjj8Yj7/Y7n84n1eo10Og1JkpBMJrFYLDjpfD7zWiwWOUaj2Wx+CSnY6/VgGAYT7/d7rny73ZgglUohHA4jkUiwCipERQn5fB6hUIgJ6/X6l5Am6sSyLGw2m4Dkfr+PXC6HTqcTkDyfz1EqlVCr1fB4PH4JqerpdHITxHi9XvBC7K/XKw6HA/ygHElsiNRPKLohAgF6Im9x6oxyxV0mbLVaUFUVuq4HJLfbbWiaxnco2a/Ee5c7XK1WiMfjiEajiMViWC6XbAg57TgOmyHLMsdms5kr3U/mfhtyjL5GJBJBJpNhl4UMMktRFHYxm81yzPuWfjJX8mQyQaVSwXQ6Dcihr1KtVjEej/8lI3wAJdmzV7QXEN4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"10\"\n        title=\"10\"\n        src=\"/static/ef3ec53f5908fdb6f93a78669c280698/d9217/10.png\"\n        srcset=\"/static/ef3ec53f5908fdb6f93a78669c280698/5a46d/10.png 300w,\n/static/ef3ec53f5908fdb6f93a78669c280698/0a47e/10.png 600w,\n/static/ef3ec53f5908fdb6f93a78669c280698/d9217/10.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 904px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABk0lEQVQoz4VSvc4BQRQdovBbkKwGHYVEJDreZqk0HkCxLyChkngFhVcQUVCIF/AToiCCRIi/xTrfd6/MZj6K7yazk51z75l7zh2B3+j1eigWi+j3+/SL1+vFi2I4HDLW6XRsTMbpdIJhGKjVarAsi8/EbrdDJBKBEALhcBibzQbP5xOPxwPr9RrxeJyxUCiE+XzORefzmfdSqcQYrUaj8SbcbreIxWLwer2IRqNYLpe43W4wTROLxQKJRAIulwuapmE8HvNlh8OBi/P5PJxOJxPW6/U3IX263S4KhYItWZU2GAyg6zra7faXZLqwXC6jWq3yRUyoJlCQF9JD6YuKUVyvV7tLNahGyB+SqQ5EHczlcrGLyD8ahswlr6k7mcuEzWYT2WwWrVbrSzKd5XI5zqFilUzmqLtYrVYIBALw+Xzw+/3sCw3kfr9jMpkgGAzC4/EwNpvN/tjy6Sl3eDwekUwm4Xa7kUqlsN/vuRNa9IQymQwcDgfS6TRjqpefZLZkeg6VSgXT6fRLDp0RNhqN/iWj+AG93KIvFHy6agAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"11\"\n        title=\"11\"\n        src=\"/static/98cc707aeaf26d4199dada98c08f0733/d9217/11.png\"\n        srcset=\"/static/98cc707aeaf26d4199dada98c08f0733/5a46d/11.png 300w,\n/static/98cc707aeaf26d4199dada98c08f0733/0a47e/11.png 600w,\n/static/98cc707aeaf26d4199dada98c08f0733/d9217/11.png 904w\"\n        sizes=\"(max-width: 904px) 100vw, 904px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"algorithm-analysis\" style=\"position:relative;\"><a href=\"#algorithm-analysis\" aria-label=\"algorithm analysis permalink\" class=\"anchor 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>Algorithm Analysis</h2>\n<p>DFS 알고리즘의 시간복잡도는 모든 노드를 순회하는 시간 𝛩(E + V) 의 시간과 각 노드에 대해 adjacency list 를 모두 확인하는 시간 𝛩(E) 만큼 걸리게 된다. 따라서 DFS의 시간 복잡도는 𝛩(E + V)\b 로 표현할 수 있다.</p>","frontmatter":{"title":"[알고리즘 정리] 깊이 우선 탐색(DFS)","date":"April 25, 2020"}}},"pageContext":{"slug":"/Algorithm-Analysis/2020-04-25-알고리즘-DFS/","previous":{"fields":{"slug":"/Database/2020-04-24-데이터베이스-트랜잭션-Transaction/"},"frontmatter":{"title":"[데이터베이스] 트랜잭션과 격리수준(Transaction and Isolation Level)","category":"Database","draft":false}},"next":{"fields":{"slug":"/Algorithm-Analysis/2020-04-25-알고리즘-BFS/"},"frontmatter":{"title":"[알고리즘 정리] 너비 우선 탐색(BFS)","category":"Algorithm-Analysis","draft":false}}}},"staticQueryHashes":["2486386679","3128451518"]}