<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>be-hind.log</title>
        <link>https://velog.io/</link>
        <description>Hello, World!</description>
        <lastBuildDate>Wed, 29 Nov 2023 08:53:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>be-hind.log</title>
            <url>https://velog.velcdn.com/images/be-hind/profile/5893eee4-ea26-4a54-9c51-5202682a0491/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. be-hind.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/be-hind" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[알고리즘] 너비 우선 탐색(BFS)]]></title>
            <link>https://velog.io/@be-hind/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%84%88%EB%B9%84-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89BFS</link>
            <guid>https://velog.io/@be-hind/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%84%88%EB%B9%84-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89BFS</guid>
            <pubDate>Wed, 29 Nov 2023 08:53:59 GMT</pubDate>
            <description><![CDATA[<h1 id="1-bfs너비-우선-탐색">1. BFS(너비 우선 탐색)</h1>
<p>BFS vs DFS</p>
<h2 id="-동작과정">-동작과정</h2>
<ol>
<li>큐 선언(2차원 배열이라면 Point 클래스를 활용) 및 시작 포인트 큐에 추가&amp;&amp;방문체크</li>
<li>while(!Queue.isEmpty()) 큐가 없어질 때까지 반복</li>
<li>Queue에서 poll하여 탐색 시작</li>
<li>방향벡터를 이용해서 for문 4방탐색</li>
</ol>
<ul>
<li>다음 행선지 NULL체크</li>
<li>탈출 포인트 선언 (예를 들어 목적지 좌표에 도착했다면)</li>
<li>장애물 및 가지 말아야하는 곳이라면 continue로 탈출</li>
<li>탐색할 수 있는 곳이라면 방문체크 및 큐 추가 (제약사항들에 대한 조건문 추가)</li>
</ul>
<h2 id="-완전탐색-방식">-완전탐색 방식</h2>
<ul>
<li>Queue자료형의 선입선출 특성을 활용</li>
<li>현재 지점에서 4방향에 탐색할 수 있는 곳들을 전부 큐에 추가</li>
<li>큐에 추가할 때는 한 개의 전역변수 느낌이 아닌 new키워드로 다른 객체를 추가함으로써 재귀와 같이 별도의 데이터를 관리</li>
<li>추가된 큐에 대해 한 개씩 poll해보며 완전탐색</li>
<li>DFS의 경우 재귀스택을 활용한 좌표 별 데이터 관리</li>
<li>BFS는 개별 객체를 통해 좌표 별 데이터 관리 (즉, 바뀌어야할 매개변수가 있다면 객체 멤버변수를 활용)</li>
</ul>
<h2 id="-특성">-특성</h2>
<ul>
<li>최단경로를 찾기위한 알고리즘으로써 DFS에 비해 속도면에서 우위를 가짐</li>
<li>미로찾기와 같은 최우선의 특정 경로를 찾는 문제에서 BFS를 떠올릴 수 있음</li>
<li>DFS의 경우 먼저 탐색한 곳 쪽으로 계속 탐색을 진행하지만 BFS의 경우 현재좌표 근처로 확산하며 탐색.<ul>
<li>DFS : 4.0 → 3.0 → 2.0 → 1.0 → 0.1 → …</li>
<li>BFS : 4.0 → 3.0 → 4.1 → 2.0 → 4.2 → …</li>
</ul>
</li>
</ul>
<h2 id="-구현">-구현</h2>
<ul>
<li><p>Graph</p>
<pre><code class="language-java">  public class Main{
      static int N, M, V; //정점 수, 간선 수, 시작 노드
      static int[][] graph;
      static boolean[] visited;

      public static void main(String[] args) {
                  /*
                  이 곳에 입력 및 배열 초기화를 진행하고, 배열크기에 맞게 visited배열 선언
                  */
          bfs(V);
      }

      //너비 우선 탐색 (그래프로 풀 경우 간선의 존재 유무만 체크하면 됨)
      static void bfs(int idx) {
          Queue&lt;Integer&gt; queue = new LinkedList&lt;Integer&gt;(); //큐 선언

          queue.add(idx); //큐에 시작지점을 추가
          visited[idx] = true; //방문체크

          while(!queue.isEmpty()){ //큐가 빌 때까지 무한루프
              int s =queue.poll(); //현재 큐에 들어있는 맨 앞의 값을 꺼냄
              for(int i =1; i&lt; graph.length;i++){ //그래프의 길이만큼 반복하면서
                  if(graph[s][i] == 1 &amp;&amp; !visited[i]){ //간선이 있을 때&amp;&amp;방문하지 않은 경우
                      queue.add(i); //큐에 계속해서 추가
                      visited[i] = true; //방문체크
                  }
              }
          }
      }
  }</code></pre>
</li>
<li><p>사방탐색</p>
<pre><code class="language-java">  class Point{ //좌표값을 저장하기 위한 Point 클래스
      int x;
      int y;
      public Point(int x, int y){
          this.x = x;
          this.y = y;
      }
  }

  public class Main{
      static int[] dx = new int[] {-1, 0, 1, 0}; //방향벡터
      static int[] dy = new int[] {0, 1, 0, -1}; //방향벡터
      static int N, M, V; //정점 수, 간선 수, 시작 노드
      static int[][] map;
      static boolean[][] visited;

      public static void main(String[] args) {
                  /*
                  이 곳에 입력 및 배열 초기화를 진행하고, 배열크기에 맞게 visited배열 선언
                  */
          bfs(0, 0); //어디서부터 탐색을 할 지
      }

      //너비 우선 탐색 (그래프가 아닌 단순 2차원 배열 좌표값을 활용할 때
      static void bfs(int x, int y) {
          Queue&lt;Point&gt; q = new LinkedList&lt;&gt;(); //큐 선언

          visited[x][y] = true; //시작지점 방문체크
          q.offer(new Point(x,y)); //큐에 시작지점 추가

          while(!queue.isEmpty()){ //큐가 빌 때까지 무한루프
              Point p = q.poll(); // 맨 앞의 큐를 꺼내고
              for (int i = 0; i &lt; 4; i++) { //큐에서 꺼낸 인덱스로부터 사방탐색
                  if (p.x + dx[i] &lt; 0 || p.x + dx[i] &gt; N - 1 || p.y + dy[i] &lt; 0 || p.y + dy[i] &gt; N - 1) continue; //Null 예외 처리
                  if(특정 조건 값){
                      visited[p.x + dx[i]][p.y + dy[i]] = true; //방문 체크
                      q.offer(new Point(p.x + dx[i], p.y + dy[i])); //탐색을 위한 큐 추가
                  }
                  //4방탐색을 돌면서 해야할 조건들을 추가**
              }
          }
      }
  }</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Init]]></title>
            <link>https://velog.io/@be-hind/Init</link>
            <guid>https://velog.io/@be-hind/Init</guid>
            <pubDate>Wed, 29 Nov 2023 01:55:29 GMT</pubDate>
            <description><![CDATA[<h1 id="벨로그를-처음-시작하며">벨로그를 처음 시작하며…</h1>
<aside>
💡 누구나가 개발 블로그를 시작해야겠다고 생각하고 어디에서 시작해야할지 고민해봤겠지…

</aside>

<pre><code class="language-jsx">System.out.println(&quot;Hello, World!&quot;);</code></pre>
]]></description>
        </item>
    </channel>
</rss>