{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm-Analysis/2020-04-25-알고리즘-BFS/","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":"f2b254d5-4d03-5394-a153-f952404a524d","excerpt":"Breadth-First Search 너비 우선 탐색으로도 불리는 BFS 역시 그래프를 탐색하기 위한 알고리즘이다. DFS는 한 노드에 대해서 제일 깊숙한 위치에 있는 레벨까지 내려가 탐색하지만 BFS는 한 레벨에 있는 모든 노드를 다 탐색하고 다음 레벨로 이동하는 방법으로 탐색을 진행한다. BFS는 최단 경로를 찾는데 유용하게 사용하는 알고리즘이고 queue 를 사용하여 구현한다. Algorithm Steps Node State 이번 강의에서 설명한 BFS…","html":"<h1 id=\"breadth-first-search\" style=\"position:relative;\"><a href=\"#breadth-first-search\" aria-label=\"breadth 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>Breadth-First Search</h1>\n<p>너비 우선 탐색으로도 불리는 BFS 역시 그래프를 탐색하기 위한 알고리즘이다. DFS는 한 노드에 대해서 제일 깊숙한 위치에 있는 레벨까지 내려가 탐색하지만 BFS는 한 레벨에 있는 모든 노드를 다 탐색하고 다음 레벨로 이동하는 방법으로 탐색을 진행한다. BFS는 최단 경로를 찾는데 유용하게 사용하는 알고리즘이고 queue 를 사용하여 구현한다.</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<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>이번 강의에서 설명한 BFS는 색깔을 통해서 각 노드의 상태를 표현하게 된다.</p>\n<ol>\n<li>White : 처음 발견된 노드</li>\n<li>Gray : 발견은 되었지만 아직 해당 노드의 이웃노드들이 모두 탐색되지는 않은 노드</li>\n<li>Black : 해당 노드의 이웃노드들이 모두 방문된 노드</li>\n</ol>\n<h3 id=\"distance\" style=\"position:relative;\"><a href=\"#distance\" aria-label=\"distance 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>Distance</h3>\n<p>각 레벨, 혹은 depth 를 나타내기 위해서 distance 를 사용한다. 같은 레벨에 있는 노드들은 같은 distance 를 같게되고, distance 는 루트 노드로 부터 얼만큼의 edge가 떨어져있는지를 표현하게 된다.</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=\"text\"><pre class=\"language-text\"><code class=\"language-text\">BFS(G, s)\n    for each vertex u in V - {s}\n        do d[u] = INFINITE\n        predecessor(u) = null\n    color[u] = gray\n    d[s] = 0\n    parent[u] = null\n    Q = null;\n\n    ENQUEUE (Q, s)\n    while Q is not empty\n        do u = dequeue (Q)\n            for each v in adj[u]\n                do if color[v] = white\n                    then color[v] = gray\n                        d[v] = d[u] + 1\n                        predecessor(v) = u\n                        ENQUEUE(Q, v)\n        color[u] = black</code></pre></div>\n<p>코드가 복잡해보일 수도 있지만 생각보다 단순한 코드이다. BFS 함수에서는 모든 노드를 다 최기화 해주고 전달된 시작 노드를 세팅해준다. 그리고 ENQUEUE 함수를 통해 모든 노드를 마킹하며 순회하게 된다. 그림으로 한번 이해해보자.</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: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABKElEQVQ4y42Sy67DMAhE/f/fmVU3SfN+u/cgnQhVXVwkJ2Y8DGBT6p8ty1K3bavZjuOo8zzX8zzDv+871i/uvu/Bva6rFjascRzrNE0hsK5rHYYhfHCIGL6YXBLo8y98yMhB13Uh9n6/4xAMIhVgYiw4cPu+D5w93EIWQBYtaVRtkC3jkzRXzTmY3CJIVgMxAmg77/kj5r2SlKowCsJCkJZzJYpIRoxHsm04tmgMeAhCpFyWmQ2klbZtHzES27bVKwaPLp9HyeWTHR8hAhHhzCDOEGUPxhka8Sg+O4HOF5WCOU4+AD68zCUpHEenUDICLPYG4xOk72AzQl6B9525xYEFIAvtGaAplsfKfcaeV26apr5er2eQbeeXSMby31W+hznf2Xf2/9gHk8z7SuXYgIwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"1\"\n        title=\"1\"\n        src=\"/static/3248e0281729b5c1d4971000ce43f2ae/3dde1/1.png\"\n        srcset=\"/static/3248e0281729b5c1d4971000ce43f2ae/5a46d/1.png 300w,\n/static/3248e0281729b5c1d4971000ce43f2ae/0a47e/1.png 600w,\n/static/3248e0281729b5c1d4971000ce43f2ae/3dde1/1.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>위와 같이 큐와 그래프가 있다고 하자. 그리고 사용자가 bfs 의 시작노드로 B를 지정해 주었다고 하자.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABPUlEQVQ4y42Su46FMAxE+f/voaWgpoWWAnrelzd491galEW3WEshxplMxpNE9hv7vts8z3bft4XRdZ2t6+q51r5hyakdx2ERn3EcbVkWn9lwnqdVVWVpmlqWZbZt20M2TZNjmfnXfgiZI8Ba7PveF1BVFIXFcWxJkjiQgOjz+TgJWHJq6oT/CLkkACBVAMzz3Oq6fmrg2DwMw4O9ruupOaGKqJQf8gf1rIkMFagjJ8gh+uOhCAUKCdUeYBTLR3L2YIUOBIP33jLqwhuVOmxomsbBOhgS6uBFxj5q8PilANIcKpaatm2dFHK1TqvgGZCDdQ917bCrbbXAoA5Gngkr1bKG4c+GAr0zQv+YUS0y1flHzfthg3UPBdKpeothhIe86+9aJMllWbpkfPr2hML5TRTWonBBxurRvk//T/wA/q/39jri92UAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"2\"\n        title=\"2\"\n        src=\"/static/98db3fee37ddf83af16505f7610f3759/3dde1/2.png\"\n        srcset=\"/static/98db3fee37ddf83af16505f7610f3759/5a46d/2.png 300w,\n/static/98db3fee37ddf83af16505f7610f3759/0a47e/2.png 600w,\n/static/98db3fee37ddf83af16505f7610f3759/3dde1/2.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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로 만들고 큐에 enqueue 해준다 . 여기까지가 pseudo code 에서 while 문 바로 앞까지의 과정이다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeElEQVQ4y4WSS6vCQAyF5///FcGNqGsFwYWIoODCTRetoiC+Wm195d4vcIa5LryBMO0kOTnJmWC/dr1e3VN7vV52uVz8xN7vt591XVvTNH9yn8+n3W43zw2n08mGw6H74XDw4OPxsMViYf1+31arVQSjaVVVVpaln+TSQP+coSgK63a71ul0LMsy705gMBhYq9Wy0WgUWVIEExwigJ3PZ7/nm4aBLrCZz+exENtsNjYej2273caRAQEAV+79frfj8egxGgXtgDFVmO5Ld+yTHAC0bwCYBiOOBRUSTJefApIsIQDknlMgmIB9ZEaAMt+y3W5n0+nU1ut1HA+GgCCeACQWY/vIWijOt1aAGL1ezyaTiRfAUELwDzAsIaO4i0ICQVwjYrPZzNrtti2XSy+U+uRJWe5hpXruAjuDES5BcMYkIVVeO5SA6cOmoT9sqUUiAOyH0dIdpY2+3UWV8zx3EQDZ7/fxrdHks/g/8JAG9K5wFqzYJ4tv9gNUKO6rjjPyZAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"3\"\n        title=\"3\"\n        src=\"/static/09041fec38f2d3116922b37143ff18cb/3dde1/3.png\"\n        srcset=\"/static/09041fec38f2d3116922b37143ff18cb/5a46d/3.png 300w,\n/static/09041fec38f2d3116922b37143ff18cb/0a47e/3.png 600w,\n/static/09041fec38f2d3116922b37143ff18cb/3dde1/3.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>이제 큐에 들어간 B를 빼내어서 해당 노드의 인접 노드들을 방문한다. 이때 한약색 상태를 가지고 있는 노드만 방문하고, 방문할 때 다음과 같은 작업을 해준다.</p>\n<ol>\n<li>회색으로 칠하기</li>\n<li>현재 distance + 1 을 distance 로 정하기</li>\n<li>부모 노드를 기록하기</li>\n<li>큐에 집어넣기</li>\n</ol>\n<p>위 그림에서는 A 노드와 F노드를 한번에 방문한 것처럼 그려두었지만 사실 A노드를 먼저 방문했기 때문에 큐에 A가 먼저 들어가게 되었다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABhUlEQVQ4y4WTO4qCQRCE5xIewWMYeyWv4TFMDAw01UBBE0EwEQTBRBTf72ftfrPUz6y7yzY0M1NMV1d3zwR92v1+1/P5ZKvX6yXb6XT6gXH38Xh8w4kF5xy22616vZ76/b5ut1sWWCqVlM/nValUsqDz+az9fq/D4RAJjHPGERDG47FqtZrq9bqm02nMPplMlMvlFEJQsVjM1ByPx0h6uVy0Xq/jfrPZRPx6vcY1wNxqtdTtdqNCl14ul1UoFNRsNjNCgnFUuhpIId/tdl8KAVHlEtJ+ocRGYkhQ4R76jAiSYMGBZHpvtDEumxxik3mf4oFA5OKQmZAyRqNRLNGKWBkiCVBmc9kkiT0kO/VbEedOp6NGo6HBYBDPuPtEDHsIPHWGwhrIxCVP0OW0221Vq1UNh8N4JgAS7uF+OuzdkkhIyam69FHPZrNsWO4reDoszE+GloR0EC7HbbClvX3H3vFIyENeLBZaLpeaz+darVbR/dYclJL8hYX0fyKbPvkb/fa//7MP0T/iY6LZqwAAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"4\"\n        title=\"4\"\n        src=\"/static/94b782ddf3b0c5e929fadb53957d6129/3dde1/4.png\"\n        srcset=\"/static/94b782ddf3b0c5e929fadb53957d6129/5a46d/4.png 300w,\n/static/94b782ddf3b0c5e929fadb53957d6129/0a47e/4.png 600w,\n/static/94b782ddf3b0c5e929fadb53957d6129/3dde1/4.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>이제 B에 해당하는 흰색 인접노드가 더 이상 없기 때문에 B 노드는 검은색으로 상태가 변경된다. 그리고 큐가 비어있지 않기 때문에 while 문은 다시 반복된다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABlUlEQVQ4y31Tu41CQQx0E5RAA+TEJASUQQlE9EAZJAQgASIigQIQJAQIISEh8f//mbvxaVbLC86Stbvz1uOxn9fwa4/HA7L3+x32l8vF18/nE7Dn84nX6/WFM4Y4zzYcDpHJZFAoFLDb7UJgqVRCOp1GtVoNQdfrFcfjEafTyQmE80ynACuXyzAz93q97pcmkwlSqZRjuVwuqDmfz056u92w3W59TxHE7/e7r8bgfD6PYrHoWVRGpVJBNptFt9sNhAymU6XaRFKSHw6HP4W6LKK4X1QiYzKSUIV6qDPLZhKaqdGUnGw0s9N4WeQkFpn2MW4MnE6nmM/nX4QsYzwee4lSxHW/33sCKpOpbCax2WyGZrOJTqfjoErt9/totVoYDAZ+pqtPVMM9CfTXWSFXo7JGo4F2u+3ZVU6v10OtVsNoNPIzA0hCZXSNDvdqiROyxOVy+TWDGurFYhHmTX0lHv8smkaGLbH4gzKrBFk8BUksiTshfwpVbjYbrFYr9/V6HWYtHqkkURKz+H2qH3pGetdJFf/ZD9H10f7k9HFwAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"5\"\n        title=\"5\"\n        src=\"/static/af6b7b5513705f9dff28e869cd4898f4/3dde1/5.png\"\n        srcset=\"/static/af6b7b5513705f9dff28e869cd4898f4/5a46d/5.png 300w,\n/static/af6b7b5513705f9dff28e869cd4898f4/0a47e/5.png 600w,\n/static/af6b7b5513705f9dff28e869cd4898f4/3dde1/5.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>큐에 들어있던 A를 dequeue 해서 똑같은 방법을 진행한다. 이때, A는 B와 연결되어 있지만 B는 이미 검은색으로 상태가 변경되었기 때문에 A가 탐색할 노드는 E 뿐이다. E의 값을 지정해주고 큐에 넣어준다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAByklEQVQ4y31SOapqQRBtBLdgoJG5mWswcwvuwMDEJYiRO3ABZiI44ICJmIo4BYIgKgaK8zye/0896tLvBq+g6L51q06fOlUG/20ymWA2m/GK7/cr5+PxQLfbxefz+RU/nU64Xq+w7fV64Xa74f1+w7Tbbfh8PgQCAXQ6HUngj1gsBq/Xi0Qi4RSu12s0m020Wi3s93t5jEDn8xmXy0XcZLNZGGPg8XiQy+WkcLfbIRQKSSwSiTiA0+kU+XwepVIJy+VSmB0OBwG63+8/gM/nE6lUCplMxmmLRubxeBzD4VC+yYasRqORSGRLw/jxeBRQA5cxUZP1JBi140lnIY3tkpVqSzP6Ct0NqMZktqfg7IpO7bRG79Jyv9/HYDCQYShYoVBANBpFrVZzgMms1+tJrg1GlmybjM18PkelUnGE1sJgMCjDCofDkkgfj8coFosol8tYLBbS1Xa7lTViDU/DKdXrdTQaDUcHWjKZhN/vRzqddmKbzQbValXWRrVjV7/WhkG2bWukrXBN7GEpe+bbMYKSLWsFkFQZ4AtkzD2kJizW6doA9t09QAGkHqvVyhGXuvBki3yADOwNcIPZcWO/oNtOV10YcwP9Zf8A7f+8s6gkgAEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"6\"\n        title=\"6\"\n        src=\"/static/f498e8d741c3e747b911ff16ec4470c8/3dde1/6.png\"\n        srcset=\"/static/f498e8d741c3e747b911ff16ec4470c8/5a46d/6.png 300w,\n/static/f498e8d741c3e747b911ff16ec4470c8/0a47e/6.png 600w,\n/static/f498e8d741c3e747b911ff16ec4470c8/3dde1/6.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>이번엔 F를 dequeue 하고 인접노드들을 처리해준다. 그림에서 확인할 수 있는 것 처럼 distance가 1인 노드들의 탐색이 모두 끝났다. 즉 레벨 1에 있던 노드에 대한 처리가 끝난 것이다.</p>\n<p>위 작업을 계속 반복해보면,</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABx0lEQVQ4y31TO4pCQRAcBK9goJG5YGDgCcy8ghcQAxE8ghgZm3gAMxFU8AUmYioiaiAI/jBQ/P+/tVu9zOP51t2GZua13TXV1a3Ctw0GA4zHY17xer3kvF6vaLVaeD6fb/H9fo/T6QSr3e93nM9nPB4PqEajAZfLBY/Hg2azKQn8IRKJwOl0Ih6Pm4WLxQK1Wg31eh2bzUYeI9DhcMDxeBRXuVwOSik4HA7k83kpXK/X8Pl8EguFQibgcDhEoVBAuVzGbDYTZtvtVoAul8sP4O12QyqVQiaTMduikXksFkO325VvsiGrXq8nElmlYXy32wmogs2YqJP1STBqx5POQhrbJSutLe0joN2YzPY0OLuiUztdo++KydFoFIlEwnyZViwWEQ6HYRiGGePv7XYbnU7nDYws2TYZq2w2K0Oh66FwLbxer8QCgYAk0vv9PkqlEiqVCqbTqei3Wq0kn4/xVNw1v9+PYDAoBdqSySTcbjfS6bQZWy6XqFarsjZaO67Y29roRK6KTtCtjEajX9qSCfWzxlhDttRXMcgPBjl6akHXU/s0devdPkRhOJlMMJ/PBYRMCcjTysTudlDtyvqC9W/E+18s/rMv3NKxExgjFmIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"7\"\n        title=\"7\"\n        src=\"/static/2bda6c30bffb233f2b67ae0404e563bf/3dde1/7.png\"\n        srcset=\"/static/2bda6c30bffb233f2b67ae0404e563bf/5a46d/7.png 300w,\n/static/2bda6c30bffb233f2b67ae0404e563bf/0a47e/7.png 600w,\n/static/2bda6c30bffb233f2b67ae0404e563bf/3dde1/7.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n</br></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB1ElEQVQ4y31Su86pQRQdf3gDUVBJlBKFwhPovIIXEIVI9BpRodR4AIWCRCSURIsIjVC4VOJ+v6//rJ3MF7/zn7OSyczsWbNnzV5b4Q9GoxEmkwmXeL1eMl+vV3Q6HTyfT9nreTAYYDab/eDebjdst1vhqGazCZvNBofDgVarJYTH44FgMAiLxYJIJAKNWq0Gq9UKl8uFfr8vsdPphG63i0qlguFwCJXL5aCUwtfXF/L5vJDW6zXcbrfE/H6/PECk02mYTCaYzWYUi0WDW6/XUSgURJCi3EQigVQqZXyBoPJwOGwo4dlyuUQ8HkcmkzF49/tdytVut+XbCh/gRZ1Yz6zNfr//pOJ8PuN4PBpr4teEn2AyKtGKLpeLmHY4HIw7+kHFRSgUQjQaFaJGqVRCIBAQIzR4TgN6vd6PZFS52WxEpcpms2IKhzaFzjmdTol5vV4hcrBlyuWyOMrWocrVaiV8PsZZsdc8Hg98Pp9c0IjFYrDb7Ugmk0aMplSrVTQaDaN27ACq5Z5DaSLt1wT9lfF4/FdtqYSd8R7jHaqVxmaQGwZ3u50kZj10kX9z/X39aaIonE6nmM/nknCxWEg/Mem7ks/xmVQP9f4CC6/rwfW/VPwP3z6poCfxej6QAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"8\"\n        title=\"8\"\n        src=\"/static/13a606d1d3f74a91e40ee1ad3072a23b/3dde1/8.png\"\n        srcset=\"/static/13a606d1d3f74a91e40ee1ad3072a23b/5a46d/8.png 300w,\n/static/13a606d1d3f74a91e40ee1ad3072a23b/0a47e/8.png 600w,\n/static/13a606d1d3f74a91e40ee1ad3072a23b/3dde1/8.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n</br></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB7klEQVQ4y41Ty8qBURQ9xBvIgJEyJAMDeQAzr2CsZCAlUykZYWjiARQDJgaGoqRcUiYiuQ2Q+/26/n+fOif0D/5VX+d8+9tnnbX32h/DL/r9PkajEW3xer34er1e0Wq18Hw++btYu90uJpPJR+7tdsN2u+U5rFKpQKvVQq/Xo9Fo8ITH4wGXywW1Wg2fzweBYrEIjUYDo9GITqfDY6fTCe12G4VCAb1eDyyVSoExBqVSiXQ6zZPW6zVMJhOPORwOfgEhHo9DoVBApVIhl8vJ3FKphGw2ywUxkhuJRBCLxWQJBFLu9XqlEvq2XC4RCoWQSCRk3v1+5+1qNpu8bIYv0EFBLFbqzX6//7iQcD6fcTweZemEPwm/QWSk5B30fjgcPsg5ISV7PB74/X5cLheZkM/n4XQ6uRECVLLb7UYwGMRut5Px6XSKWq2G1WoFlkwmuSn0CFNIvsFg4DGr1SqVhMNhmZvJZHhssVigXC5zAfV6HYxmzWKxwGaz8RkTCAQC0Ol0iEajMlatVmE2m2G32zEYDGR/iYMIaZ6ZKIXsFzMoejkcDiWZGOzZbIbNZvMRo1WaQgfpryAi6gsR0wHq7bfrguB9/24i7bnC8XiM+XzOCUktzROR0kV/kX6Tie+c8P0Gsp4MoNmi/fc8/gc/hHKPksfhtNUAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"9\"\n        title=\"9\"\n        src=\"/static/da2a4ea2698bb5afce0b6ee9e259abf2/3dde1/9.png\"\n        srcset=\"/static/da2a4ea2698bb5afce0b6ee9e259abf2/5a46d/9.png 300w,\n/static/da2a4ea2698bb5afce0b6ee9e259abf2/0a47e/9.png 600w,\n/static/da2a4ea2698bb5afce0b6ee9e259abf2/3dde1/9.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n</br></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB50lEQVQ4y41TPeu5URg+xDeQgUkZyWCQD2Bi8QHMCoOUbJKSCaPFB1AWJmWmpMhASUneBu/y/n79/vep8+SR4X+Vznmu7nPd51z3heEfBoMBxuMxbfF+v/l6u93Qbrfxer34t1j7/T6m06mMO51OvJbAarUatFot9Ho9Wq0WJ5/PJzweD9RqNYLBIAQqlQo0Gg2MRiM6nQ7nrtcr3G43r41Go2C5XA6MMSiVSuTzeV603W5hMpk453A4eANCOp2GQqGASqVCsVjk3Gw2g8Fg4BpOpxPsfr8jkUgglUpJzyXQzQOBALrdrmTFer1GLBZDJpPBJ8rlMvx+P3q9Hhi+QAeFsFjJq8PhIGtIuFwuOB6PMu6n4DdI7PF4yDj6/hSjwXBBKvb5fAiFQtxggVKpBJfLxQchQE/2er2IRCLY7/cSTz42Gg1sNhuwbDbLDaWfGMr5fJaMtlqt0k3i8bhUWygUOLdcLlGtVvkFms0mGOXHYrHAZrPxjAmEw2HodDokk0mJq9frMJvNsNvtGA6Hkr+kQYKUZyaeQlERGRRejkYjSUyEeD6fY7fbyTha6VXcQzpI/woSIl+omKL0a+pC4HP/OUTa8xtOJhMsFgs+zdVqJQnSoV8R+hYTTbngZwfKFY3/V/f/xR/QzYPdHYY8GQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"10\"\n        title=\"10\"\n        src=\"/static/eab21a18a303b87ac80b12d7036cdfaa/3dde1/10.png\"\n        srcset=\"/static/eab21a18a303b87ac80b12d7036cdfaa/5a46d/10.png 300w,\n/static/eab21a18a303b87ac80b12d7036cdfaa/0a47e/10.png 600w,\n/static/eab21a18a303b87ac80b12d7036cdfaa/3dde1/10.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n</br></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1018px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB2UlEQVQ4y6VTTctxURQ9xD8QRQbKkAwMZCwjSn6AscJASmaSkhHKxMQPUCaMlLliIgNKSvI1MBD5/l7vu8/TuV23Z/asuu17V+usfc46+zL8x3Q6xWKxoFd8Ph9e7/c7BoMB3u83/xZ1MplgtVp9cefzmWsJrNPpQK/Xw2Qyod/vc/L1eiEUCkGr1SIej0Og3W5Dp9PBarViOBxy7na7IRgMcm06nQarVqtgjEGtVqNWq3HRbreDzWbjnNfr5Q0IxWIRKpUKGo0GjUaDc+v1GhaLhXv4fD6wx+OBXC6HQqEgHZdAO4/FYhiNRlIU2+0WmUwGpVIJcrRaLUSjUYzHYzAoQAuFsaiU1fF4/GpIuF6vOJ1OX9yvhkqQ2fP5/OLoW2nGDUkciUSQSCR4wALNZhN+v59fhAAdORwOI5VK4XA4SDxlHwgE0Ov1wCqVCg+UHnEpl8tFCtrpdEo7yWazkrZer3OOxs1gMHDO4/GA0fw4HA64XC4+YwLJZBJGoxH5fF7iut0u7HY73G43ZrOZlC+d0Gw2o1wu/2RIR6FRkQ8rZTmfzyUzwW82G+z3e2leRRVaRgvpr6CQlbervHVhqmws1/IdLpdL3lkuoEqLfhshpZlcy5Qd/op/Gl14dmlRbSUAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"11\"\n        title=\"11\"\n        src=\"/static/c54607bcc732337534371c3bfb8a8cfb/3dde1/11.png\"\n        srcset=\"/static/c54607bcc732337534371c3bfb8a8cfb/5a46d/11.png 300w,\n/static/c54607bcc732337534371c3bfb8a8cfb/0a47e/11.png 600w,\n/static/c54607bcc732337534371c3bfb8a8cfb/3dde1/11.png 1018w\"\n        sizes=\"(max-width: 1018px) 100vw, 1018px\"\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>더 이상 탐색할 노드가 없을 때까지 while 문에 의해 진행된다. 이제 큐에 들어있는 노드가 하나도 없기 때문에 while 문은 종룓되고 BFS가 완료된다.</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>BFS를 진행하는데 필요한 시간복잡도는 다음과 같다.</p>\n<ol>\n<li>각 노드를 enqueue 하는 시간, 즉 white 상태인 노드를 gray로 바꾸는 시간 : 𝛩(V)</li>\n<li>각 노드를 dequeue 하는 시간, 즉 gray 상태인 노드를 black으로 바꾸는 시간 : 𝛩(V)</li>\n<li>Ajacency List 를 통해서 인접노드를 모두 탐색하는 시간 : 𝛩(E)</li>\n</ol>\n<p>따라서 전체 시간은 𝛩(V + E) 가 된다.</p>","frontmatter":{"title":"[알고리즘 정리] 너비 우선 탐색(BFS)","date":"April 25, 2020"}}},"pageContext":{"slug":"/Algorithm-Analysis/2020-04-25-알고리즘-BFS/","previous":{"fields":{"slug":"/Algorithm-Analysis/2020-04-25-알고리즘-DFS/"},"frontmatter":{"title":"[알고리즘 정리] 깊이 우선 탐색(DFS)","category":"Algorithm-Analysis","draft":false}},"next":{"fields":{"slug":"/Problem-Solving/2020-05-05-백준-가운데를-말해요/"},"frontmatter":{"title":"[백준 알고리즘] 1655번: 가운데를 말해요","category":"Problem-Solving","draft":false}}}},"staticQueryHashes":["2486386679","3128451518"]}