Algorithm

[μ•Œκ³ λ¦¬μ¦˜] BFS λ„ˆλΉ„ μš°μ„  탐색 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2178번 미둜 탐색 with μžλ°” )

2024. 2. 24. 23:43
λͺ©μ°¨
  1. πŸ€” BFS ( Breadth First Search ) λ„ˆλΉ„ μš°μ„  탐색?
  2. βœ” λ¬Έμ œμœ ν˜•
  3. βœ” μ‹œκ°„λ³΅μž‘λ„
  4. βœ” 탐색 방법

 

πŸ€” BFS ( Breadth First Search ) λ„ˆλΉ„ μš°μ„  탐색?

 

κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜μ˜ ν•˜λ‚˜λ‘œ,  루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•˜μ—¬ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

μ‹œμž‘ μ •μ μœΌλ‘œλΆ€ν„° κ°€κΉŒμš΄ 정점을 λ¨Όμ € λ°©λ¬Έν•˜κ³  멀리 λ–¨μ–΄μ Έ μžˆλŠ” 정점을 λ‚˜μ€‘μ— λ°©λ¬Έν•˜λŠ” 순회 λ°©λ²•μž…λ‹ˆλ‹€. 즉, 깊게 νƒμƒ‰ν•˜κΈ° 전에 λ„“κ²Œ νƒμƒ‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜 λ˜λŠ” μž„μ˜μ˜ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ μ“°μž…λ‹ˆλ‹€.

 

μž₯점

  • μΆœλ°œλ…Έλ“œμ—μ„œ λͺ©ν‘œλ…Έλ“œκΉŒμ§€μ˜ μ΅œλ‹¨ 경둜λ₯Ό 보μž₯ν•œλ‹€.

단점

  • λ…Έλ“œμ˜ μˆ˜κ°€ λ§Žμ„μˆ˜λ‘ 탐색 κ°€μ§€κ°€ κΈ‰κ²©ν•˜κ²Œ μ¦κ°€ν•˜μ—¬ 보닀 λ§Žμ€ κΈ°μ–΅ 곡간이 ν•„μš”ν•˜λ‹€.
  • ν•΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μœ ν•œ κ·Έλž˜ν”„μ˜ 경우 λͺ¨λ“  κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•œ 후에 μ‹€νŒ¨ν•œλ‹€.

 

βœ” λ¬Έμ œμœ ν˜•

  • μ΅œλ‹¨ 경둜 μ°ΎκΈ°

 

βœ” μ‹œκ°„λ³΅μž‘λ„

λ…Έλ“œκ°€ N이고, κ°„μ„ μ˜ μˆ˜κ°€ E인 κ·Έλž˜ν”„μ˜ 경우

DFSμ•Œκ³ λ¦¬μ¦˜κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 인접 ν–‰λ ¬λ‘œ ν‘œν˜„λœ 경우 O(N^2) 인접 리슀트둜 ν‘œν˜„λœκ²½μš° O(N+E) μž…λ‹ˆλ‹€.

 

[μ•Œκ³ λ¦¬μ¦˜] DFS 깊이 μš°μ„  탐색 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2667번 λ‹¨μ§€λ²ˆν˜Έ 뢙이기 with μžλ°”)

πŸ€” DFS ( Depth First Search ) 깊이 μš°μ„  탐색? κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν•˜λ‚˜μ˜ μ •μ μœΌλ‘œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ°¨λ‘€λŒ€λ‘œ λͺ¨λ“  정점듀을 ν•œ λ²ˆμ”© λ°©λ¬Έν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ μž…λ‹ˆλ‹€. 즉 κ·Έλž˜ν”„ ν˜•νƒœμ˜ μžλ£Œκ΅¬μ‘°μ—μ„œ

average1.tistory.com

 

 

 

βœ” 탐색 방법

BFSλŠ” DFSκ°€ μž¬κ·€ 호좜 or Stack을 μ‚¬μš©ν•˜λŠ”κ²ƒκ³Ό 달리, μΈμ ‘ν•œ 정점을 λ¨Όμ € 탐색 ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ„ μž…μ„ μΆœ(FIFO)의 νŠΉμ§•μ„ κ°–κ³ μžˆλŠ” Queue 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

 

[자료ꡬ쑰] 큐(Queue)의 이해와 κ΅¬ν˜„ with μžλ°”

πŸ€” Queue? 'λŒ€κΈ°μ—΄'이라고 μƒκ°ν•˜λ©΄ 이해가 μ‰¬μšΈ 것 μž…λ‹ˆλ‹€. ν”νžˆ κ²Œμž„μ—μ„œ '큐 λŒλ¦°λ‹€', '큐 μž‘ν˜”λ‹€' 같은 말을 듀은적이 μžˆμ„κ²ƒμ΄λ‹€ μ΄λ•Œ νλŠ” Queueλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. νλŠ” FIFO(First In First Out)μ„ μž…μ„ 

average1.tistory.com

 

문제λ₯Ό ν’€λ©΄μ„œ BFSλ₯Ό μ‚¬μš©ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

2178번: 미둜 탐색

첫째 쀄에 두 μ •μˆ˜ N, M(2 ≀ N, M ≀ 100)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” M개의 μ •μˆ˜λ‘œ λ―Έλ‘œκ°€ μ£Όμ–΄μ§„λ‹€. 각각의 μˆ˜λ“€μ€ λΆ™μ–΄μ„œ μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

www.acmicpc.net

 

πŸ”Ž μ½”λ“œ

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;

public class Main{
    static int[][] visited;
    static int[][] maze;
    static int n;
    static int m;
    
	public static void main(String[] args) throws IOException {
       	BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
        
        String[] nm = br.readLine().split(" ");
        n = Integer.parseInt(nm[0]);
        m = Integer.parseInt(nm[1]);

        maze = new int[n][m];
        visited = new int[n][m];

        for( int i = 0; i<n; i++){
            String[] arr = br.readLine().split("");
            for( int j = 0; j<m; j++){
                maze[i][j] = Integer.parseInt(arr[j]);
            }
        }

        bfs(0,0);
        
        System.out.print(visited[n-1][m-1]);

	}
    
    static void bfs(int y, int x){
        Queue<int[]> queue = new LinkedList<>();
        visited[y][x] = 1; // 처음 λ°©λ¬Έν•œ μœ„μΉ˜μ΄κΈ° λ•Œλ¬΄μ— 1둜 μ„€μ •ν•©λ‹ˆλ‹€. 
        queue.offer(new int[]{y,x}); // queue에 ν˜„μ œ μœ„μΉ˜λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

        int[] dx = {1,0,-1,0};
        int[] dy = {0,-1,0,1};
        //queue에 값이 μ—†μ„λ•Œ κΉŒμ§€ while문을 μ‹€ν–‰ν•©λ‹ˆλ‹€.
        //즉, 쑰건에 λ§žλŠ” 경둜 끝(ν–‰λ ¬μ˜ 끝 [n,m])에 λ„λ‹¬ν• λ•Œ κΉŒμ§€ μ‹€ν–‰ν•©λ‹ˆλ‹€.
        while (!queue.isEmpty()){
            int[] cur = queue.poll();
            int curX = cur[1];
            int curY = cur[0];
            for( int i = 0; i<4; i++){
                int nx = dx[i] + curX;
                int ny = dy[i] + curY;

				//μœ„μΉ˜μ˜ 상,ν•˜,쒌,우 λ°©ν–₯으둜 탐색을 ν•΄μ•Όν•©λ‹ˆλ‹€.
                //ν•˜μ§€λ§Œ 방문을 ν–ˆκ±°λ‚˜, indexλ₯Ό λ²—μ–΄λ‚œ 값은 queue에 μΆ”κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
                if( ny >= 0 && nx >= 0 && ny < n && nx < m ){
                    if( visited[ny][nx] == 0 && maze[ny][nx] == 1){
                    
                    	//ν˜„μž¬ μœ„μΉ˜μ— 값에 +1 ν•˜μ—¬ λ‹€μŒ μœ„μΉ˜μ— μΆ”κ°€ν•¨μœΌλ‘œμ¨ 값이 μ¦κ°€ν•˜κ²Œ ν•©λ‹ˆλ‹€.
                        visited[ny][nx] = visited[curY][curX] +1;
                        queue.offer(new int[]{ny,nx}); //μœ„μΉ˜κ°€ 쑰건에 λ§žλ‹€λ©΄ queue에 μΆ”κ°€ν•˜μ—¬ λ‹€μŒ 탐색을 ν•˜κ²Œ ν•©λ‹ˆλ‹€.
                    }
                }
            }
        }
    }
}

 

 

그림처럼 미둜의 길을 μ§€λ‚˜κ°ˆλ•Œλ§ˆλ‹€ 값이 1μ”© μ¦κ°€ν•˜μ—¬ λͺ©μ μ§€(n,m)κΉŒμ§€μ˜ μ΅œμ†Œ 거리λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

쀑간에 λŒμ•„κ°€λŠ” 길도 μžˆμ§€λ§Œ queueλ₯Ό 톡해 순차적으둜 μΈμ ‘ν•œ μœ„μΉ˜λ₯Ό λ¨Όμ € νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ— 이전값을 μ°¨λ‘€λ‘œ λ”ν•˜λ©΄μ„œ λ‚˜μ•„κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 


 

πŸ“š Reference : https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[μ•Œκ³ λ¦¬μ¦˜] 동적 κ³„νšλ²•(Dynamic Programming, DP) μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 24416번 ν”Όλ³΄λ‚˜μΉ˜ 수-1 with μžλ°” )  (0) 2024.03.15
[μ•Œκ³ λ¦¬μ¦˜] Brute force 브루트포슀 μ•Œκ³ λ¦¬μ¦˜ μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2309번 일곱 λ‚œμŸμ΄ with μžλ°” )  (0) 2024.03.07
[μ•Œκ³ λ¦¬μ¦˜] Floyd-Warshall ν”Œλ‘œμ΄λ“œ-와샬 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 11404번 경둜 μ°ΎκΈ° with μžλ°” )  (0) 2024.02.29
[μ•Œκ³ λ¦¬μ¦˜] DFS 깊이 μš°μ„  탐색 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2667번 λ‹¨μ§€λ²ˆν˜Έ 뢙이기 with μžλ°”)  (0) 2024.02.23
  1. πŸ€” BFS ( Breadth First Search ) λ„ˆλΉ„ μš°μ„  탐색?
  2. βœ” λ¬Έμ œμœ ν˜•
  3. βœ” μ‹œκ°„λ³΅μž‘λ„
  4. βœ” 탐색 방법
'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [μ•Œκ³ λ¦¬μ¦˜] 동적 κ³„νšλ²•(Dynamic Programming, DP) μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 24416번 ν”Όλ³΄λ‚˜μΉ˜ 수-1 with μžλ°” )
  • [μ•Œκ³ λ¦¬μ¦˜] Brute force 브루트포슀 μ•Œκ³ λ¦¬μ¦˜ μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2309번 일곱 λ‚œμŸμ΄ with μžλ°” )
  • [μ•Œκ³ λ¦¬μ¦˜] Floyd-Warshall ν”Œλ‘œμ΄λ“œ-와샬 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 11404번 경둜 μ°ΎκΈ° with μžλ°” )
  • [μ•Œκ³ λ¦¬μ¦˜] DFS 깊이 μš°μ„  탐색 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2667번 λ‹¨μ§€λ²ˆν˜Έ 뢙이기 with μžλ°”)
μž₯μš©μ„
μž₯μš©μ„
κ³΅λΆ€ν•œ λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
μž₯μš©μ„
dot
μž₯μš©μ„
전체
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (38)
    • Backend (12)
      • JPA (7)
      • Spring (3)
    • CS (2)
    • Algorithm (18)
      • 자료ꡬ쑰 (3)
      • 문제 (10)
    • Project (6)
      • SpringBoot+JPA κ²Œμ‹œνŒ (6)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

인기 κΈ€

νƒœκ·Έ

  • κ²Œμ‹œνŒ
  • κ³¨λ“œ
  • ν…ŒμŠ€νŠΈμ½”λ“œ
  • 자료ꡬ쑰
  • 1890번
  • dfs
  • λ°±μ€€
  • JPA
  • μžλ°”
  • spring data JPA
  • ORM
  • Java
  • Builder
  • DP
  • μ•Œκ³ λ¦¬μ¦˜
  • CRUD
  • 12865번
  • λ°±νŠΈλž˜ν‚Ή
  • 싀버
  • spring

졜근 λŒ“κΈ€

졜근 κΈ€

hELLO Β· Designed By μ •μƒμš°.
μž₯μš©μ„
[μ•Œκ³ λ¦¬μ¦˜] BFS λ„ˆλΉ„ μš°μ„  탐색 μ•Œμ•„λ³΄κΈ° ( λ°±μ€€ 2178번 미둜 탐색 with μžλ°” )
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.