์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ BFS ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ผ  ๋‘ ๋ฌธ์ œ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•ด์„œ

๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ•„์š”ํ•œ ์‚ฌ๊ณ ๋ฐฉ์‹๊ณผ ๋…ผ๋ฆฌ๋ฅผ ์™„์ „ํžˆ ์ •๋ฆฌํ• ๊นŒ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ •๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ๋ฌธ์ œ์—๋„ ํ™•์žฅํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก 

์™ธ์šฐ๋Š” ํฌ์ธํŠธ์™€ ์‚ฌ๊ณ  ๊ณต์‹๋„ ๊ฐ™์ด ์ •๋ฆฌํ•  ๊ฒƒ์ด๋‹ค. 


์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ  : ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ํ†ตํ•ด ๋ชฉ์ ์ง€ ๋„๋‹ฌํ•˜๊ธฐ. 

 0   1   2   3
  +---+---+---+---+
0 | S | โ–  | O | O |
  +---+---+---+---+
1 | O | O | O | โ–  |
  +---+---+---+---+
2 | โ–  | โ–  | O | โ–  |
  +---+---+---+---+
3 | O | O | O | G |
  +---+---+---+---+
  
  (0,0)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (3, 3)์ธ ๋„์ฐฉ์ ์œผ๋กœ ๊ฐ€์•ผํ•œ๋‹ค. 
  ์กฐ๊ฑด์€ ๋ˆˆ์„ ๊ฐ๊ณ  ํ•œ ์นธ์”ฉ๋งŒ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  ๊ทธ๋ž˜์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ธ์ง€, ๋จผ์ € ํ™•์ธํ•˜๊ณ  ํ•˜๋‚˜์”ฉ ์ค„ ์„ธ์›Œ์„œ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

 

 

์ •๋‹ต ์ฝ”๋“œ 

package -

import java.util.*;

public class MazeSolver {
  
   static int N = 4; 
   static int[][] maze = {
      {1, 0, 1, 1},
      {1, 1, 1, 0},
      {0, 0, 1, 0},
      {1, 1, 1, 1}
   }
      // ์ƒ, ์šฐ, ํ•˜, ์ขŒ
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) {
        boolean result = bfs(0, 0);
        System.out.println(result ? "๋ฏธ๋กœ ํƒˆ์ถœ ์„ฑ๊ณต" : "๋ฏธ๋กœ ํƒˆ์ถœ ์‹คํŒจ!");
    }
    
    
    static boolean bfs(int startX, int startY){
       Queue <int[]> queue = new LinkedList<>();
       boolean[][] visited = new boolean[N][N];
       
       queue.add(new int[]{startX, startY});
       visited[startX][startY] = true;
       
       while (!queue.isEmpty()){
          int[] current = queue.poll();
          int x = current[0];
          int y = current[1];
          
          if (x == N-1 && y == N-1) return true;
          
          for (int i = 0; i < 4 ; i++) {
              int nx = x + dx[i];
              int ny = y + dy[i];
              
              if (nx >= 0 && nx < N && ny >= 0 && ny < N
                  && !visited[nx][ny] && maze[nx][ny] == 1) {
                  queue.add(new int[]{nx,ny});
                  visited[nx][ny] = true;
                  }
          }
       }
       return false; // ๋„์ฐฉํ•˜์ง€ ๋ชปํ•จ
    }
  
}

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ  : ์ •์ˆ˜ ํ–‰๋ ฌ์—์„œ ์•ˆ์ „ ์˜์—ญ ์ฐพ๊ธฐ

 

๋ฌธ์ œ ์„ค๋ช…: 

N×N ํฌ๊ธฐ์˜ ์ •์ˆ˜ ํ–‰๋ ฌ์ด ์žˆ๋‹ค.

๊ฐ ์นธ์—๋Š” ๊ทธ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์ ํ˜€ ์žˆ๋‹ค.

๋น„๊ฐ€ ๋‚ด๋ ค ํŠน์ • ๋†’์ด ์ดํ•˜์˜ ๋ชจ๋“  ์ง€์ ์ด ๋ฌผ์— ์ž ๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ,

๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ผ.

 

์•ˆ์ „ํ•œ ์˜์—ญ์ด๋ž€ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์ง€์ ๋“ค์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ์˜์—ญ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ž…๋ ฅ:

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ํ–‰๋ ฌ์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100)
  • ๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ฐ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ ๋†’์ด ≤ 100)

์ถœ๋ ฅ:

๋ฌผ์— ์ž ๊ธฐ๋Š” ๋†’์ด๋ณ„๋กœ ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋†’์ด ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„ ์ง€๋„์—์„œ, ํŠน์ • ๋น„ ๋†’์ด ์ดํ•˜์˜ ์นธ์€ ๋ฌผ์— ์ž ๊ธด๋‹ค๊ณ  ํ•  ๋•Œ, ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐ๋œ ์•ˆ์ „ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ. 
-> ๋†’์ด๋ณ„๋กœ ์ง€๋„๋ฅผ BFS ํƒ์ƒ‰ํ•˜์—ฌ
-> ์—ฐ๊ฒฐ๋œ ์•ˆ์ „ ์˜์—ญ์˜ ์ˆ˜๋ฅผ ์„ธ๊ณ , ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅ!

์ •๋‹ต์ฝ”๋“œ 

package -

import java.util.*;

public class SafeZone {
  
  // ๋ฐฉํ–ฅ ๋ฐฐ์—ด : ์ƒ, ์šฐ, ํ•˜, ์ขŒ
  static int[] dx = {-1, 0, 1, 0};
  static int[] dy = {0, 1, 0, -1};
  
  // ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ , ์—ฌ๊ธฐ์„œ ์ž…๋ ฅ ๋ฐ›๊ณ  ์ „์ฒด ๋กœ์ง์„ ์‹คํ–‰ - ์ „์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ
  static int N; // ์ง€๋„์˜ ํฌ๊ธฐ
  static int[][] map; // ์ง€๋„์˜ ๋†’์ด ์ •๋ณด
  static boolean[][] visited; // BFS์—์„œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ
  
  public static void main(String[] args) {
      
      // ์ž…๋ ฅ - ์ง€๋„ ํฌ๊ธฐ ๋ฐ map ๊ฐ’ ์ž…๋ ฅ์— ์‚ฌ์šฉ
      Scanner sc = new Scanner(System.in);
      N = sc.nextInt(); // ์ง€๋„ ํฌ๊ธฐ(N * N)๋ฅผ ์„ค์ •, ์ดํ›„ 2์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ๋จ.
      
      
      map = new int[N][N]; // 2์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ, ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”. map์€ ๊ฐ ์นธ์˜ ๋†’์ด ์ €์žฅ. 
      int maxHeight = 0; // ์ž…๋ ฅ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ์ง€์ ์„ ๊ธฐ์–ต. ์ด๊ฑด ๋†’์ด๋ณ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฒ”์œ„ ์ง€์ •์— ์‚ฌ์šฉ๋จ
      
      // ๊ฐ ์นธ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋†’์ด ์ž…๋ ฅ ๋ฐ›๊ธฐ, ์ดํ›„ ๋น„ ๋†’์ด ๋ฒ”์œ„๋ฅผ ์ •ํ•˜๋Š”๋ฐ ํ•„์š”
      for (int i = 0; i < N; i++) {
          for (int j = 0; j < N ; j++) {
              // map[i][j]์— ์ž…๋ ฅ ์ €์žฅํ•˜๊ณ  ๋™์‹œ์— maxHeight ๊ฐฑ์‹ 
              map[i][j] = sc.nextInt();
              maxHeight = Math.max(maxHeight, map[i][j]);
          }
      }
      // ๊ฐ ๋†’์ด์—์„œ ์ฐธ์ƒ‰ํ•œ safe zone ์ค‘ ์ตœ๋Œ€๊ฐ’ ์ €์žฅ์šฉ
      int maxSafeZones = 0;
      
      // ๋น„์˜ ๋†’์ด๋ฅผ 0๋ถ€ํ„ฐ maxHeight๊นŒ์ง€ ๋ชจ๋‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ - ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ž ๊ธฐ์ง€ ์•Š์€ ์ง€์—ญ ํŒ๋‹จ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋จ
      for (int height = 0; height <= maxHeight; height++) {
          visited = new boolean[N][N]; // ํ˜„์žฌ height ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐ์ค€ ๋ฐฉ๋ฌธ ์ฒดํฌ
          int safeZones = 0; // ํ˜„์žฌ ๋†’์ด์—์„œ์˜ ์•ˆ์ „ ์˜์—ญ ๊ฐœ์ˆ˜
          
          // ๋ชจ๋“  ์นธ์„ ์ˆœํšŒํ•˜๋ฉฐ ์•ˆ์ „ ์˜์—ญ์˜ ์‹œ์ž‘์ ์„ ์ฐพ๊ธฐ ์œ„ํ•จ
          for (int i = 0; i < N; i++) {
              for (int j = 0; j < N; j++) {
                  // ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ๊ณ , ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์นธ์ด๋ผ๋ฉด bfs()ํƒ์ƒ‰์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์˜์—ญ ๋ชจ๋‘ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
                  if (!visited[i][j] && map[i][j] > height) {
                      bfs(i, just, height);
                      safeZones++; // ๋ฉ์–ด๋ฆฌ ํ•œ๊ฐœ ๋ฐœ๊ฒฌ!
                  }
              }
          }
          // ํ˜„์žฌ height์—์„œ ์ฐพ์€ safe zone ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€์ด๋ฉด ๊ฐฑ์‹ 
          maxSafeZones = Math.max(maxSafeZones, safeZones);
      }
      
      System.out.println(maxSafeZones);
  }
  // ์ด์ œ BFS ํ•จ์ˆ˜ ๋“ค์–ด๊ฐ€์ž
  // startX,startY์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์•ˆ์ „ ์˜์—ญ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ - main์—์„œ ์˜์—ญ ์ฐพ์„ ๋•Œ ํ˜ธ์ถœ๋จ
  static void bfs(int starX, int starY, int height) {
  
      
      Queue<int[]> queue = new LinkedList<>();
      queue.offer(new int[]{startX, startY}); //ํ์— ์‹œ์ž‘์  ์ถ”๊ฐ€
      visited[startX][startY] = true; // ๋ฐฉ๋ฌธ ์ฒดํฌ
      
      // ํ์—์„œ ํ•˜๋‚˜ ๊บผ๋‚ด์„œ ํ˜„์žฌ ์ขŒํ‘œ ์ €์žฅ
      while (!queue.isEmpty()){
         int[] current = queue.poll();
         int x = current[0];
         int y = current[1];
         
         // ์ƒ์šฐํ•˜์ขŒ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์Œ ์นธ ํ™•์ธ
         for (int i = 0; i < 4; i++) {
             int nx = x + dx[i];
             int ny = y + dy[i];
             
             
             // ๋ฒ”์œ„ ์•ˆ์— ์žˆ๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ  ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์•˜์œผ๋ฉด ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
             if (nx >= 0 && nx < N && ny >= 0 && ny < N
                 && !visited[nx][ny] && map[nx][ny] > height) {
                 queue.offer(new int[]{nx, ny});
                 visited[nx][ny] = true;
                 }
         }
      }
  }
}

 

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์ „์ฒด ๋…ผ๋ฆฌ ํ๋ฆ„ ์š”์•ฝ!

1. ์ž…๋ ฅ : N*N ์ •์ˆ˜ ํ–‰๋ ฌ(map)์„ ์ž…๋ ฅ ๋ฐ›๊ณ , ๊ฐ€์žฅ ๋†’์€ ๋†’์ด(maxHeight)๋„ ๊ตฌํ•จ

2. ๋ฐ˜๋ณต : ๋น„์˜ ๋†’์ด(height)๋ฅผ 0๋ถ€ํ„ฐ maxHeight๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ๋ฐ˜๋ณต

์„œ๋กœ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ๋ธ”๋Ÿญ์€ ํ•˜๋‚˜์˜ ์•ˆ์ „ ์˜์—ญ(๋ฉ์–ด๋ฆฌ)๋กœ ์„ผ๋‹ค.
๊ทธ๋ž˜์„œ ๋น„์˜ ๋†’์ด๊ฐ€ ๋†’์„์ˆ˜๋ก ์•ˆ์ „ ์˜์—ญ์ด ๋งŽ์€๊ฒƒ์ด ์•„๋‹ˆ๋ผ
๋น„์˜ ๋†’์ด์— ๋”ฐ๋ผ ์ƒํ•˜์ขŒ์šฐ ์—ฐ๊ฒฐ๋˜๋Š” ๋ฉ์–ด๋ฆฌ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—
์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฉ์–ด๋ฆฌ ์ฆ‰, ์•ˆ์ „ ์˜์—ญ ๊ฐœ์ˆ˜๊ฐ€ ์–ด๋–ค ๋†’์ด์—์„œ ๊ฐ€์žฅ ๋งŽ์€์ง€๋ฅผ ์„ธ๋Š” ๊ฒƒ์ด๋‹ค. 

3. BFS: ํ˜„์žฌ ๋†’์ด์—์„œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์•ˆ์ „ ์˜์—ญ์„ BFS๋กœ ํƒ์ƒ‰

4. ์˜์—ญ ์ˆ˜ ์„ธ๊ธฐ : ๊ฐ height๋งˆ๋‹ค ์•ˆ์ „ ์˜์—ญ์˜ ๊ฐœ์ˆ˜(safeZones)๋ฅผ ์„ธ๊ณ  ์ตœ๋Œ“๊ฐ’ ์ €์žฅ

5. ์ถœ๋ ฅ : ๊ฐ€์žฅ ๋งŽ์€ ์•ˆ์ „ ์˜์—ญ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅ. 


1.  BFS ๋‘ ๋ฌธ์ œ์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

ํ•ญ๋ชฉ ๋ฏธ๋กœ ํƒˆ์ถœ ์•ˆ์ „ ์˜์—ญ
๋ชฉํ‘œ (0,0) → (N-1,N-1) ๋„๋‹ฌ ์—ฌ๋ถ€ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ “์•ˆ์ „ ์˜์—ญ”์˜ ๊ฐœ์ˆ˜
๋ฐฉ์‹ BFS๋กœ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰ BFS๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋Œ๋ ค์„œ “์—ฌ๋Ÿฌ ์˜์—ญ”์„ ์…ˆ
๊ณตํ†ต์  ๋ฐฉํ–ฅ ๋ฐฐ์—ด ์‚ฌ์šฉ, ํ ์‚ฌ์šฉ, ๋ฐฉ๋ฌธ ์ฒดํฌ, BFS ๊ตฌ์กฐ ๋™์ผ
์ฐจ์ด์  ๋ชฉ์ ์ง€ ๋„๋‹ฌ์ด๋ฉด ๋ ๋†’์ด๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ์˜์—ญ ๊ฐœ์ˆ˜ ์…ˆ
์กฐ๊ฑด maze[nx][ny] == 1  map[nx][ny] > ๋ฌผ๋†’์ด(height)

 


2.1 ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉ๋œ ์ปดํ“จํ„ฐ ์‚ฌ๊ณ ๋ฐฉ์‹ ํ•ต์‹ฌ 3๊ฐ€์ง€

 

 2.1.1 ์ƒํƒœํ‘œํ˜„

๋ฏธ๋กœ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„(maze[x][y])

๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋Š” visited[x][y]๋กœ ํ‘œํ˜„

Queue์— ์ขŒํ‘œ [x, y]๋ฅผ ๋„ฃ์œผ๋ฉฐ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅ

 

 2.1.2 ๊ฒฝ๋กœ ํƒ์ƒ‰ (ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ)

BFS๋ฅผ ์‚ฌ์šฉํ•ด ๋„ค ๋ฐฉํ–ฅ(์ƒํ•˜์ขŒ์šฐ)์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐ˜๋ณต ํ™•์ธ

๋จผ์ € ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋ถ€ํ„ฐ ๋„“๊ฒŒ ํผ์ง€๋“ฏ์ด ํƒ์ƒ‰.

 

 2.1.3 ์ข…๋ฃŒ ์กฐ๊ฑด ์„ค์ •

๋„์ฐฉ์  (N-1, N-1)์— ๋„๋‹ฌํ•˜๋ฉด ์ฆ‰์‹œ true ๋ฐ˜ํ™˜

ํ๊ฐ€ ๋ชจ๋‘ ๋น„์—ˆ๋Š”๋ฐ ๋„์ฐฉ์ ์— ๋„๋‹ฌ ๋ชปํ•˜๋ฉด false ๋ฐ˜ํ™˜

 


2.2 ๋‘๋ฒˆ์งธ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉ๋œ ์ปดํ“จํ„ฐ์  ์‚ฌ๊ณ ๋ฐฉ์‹ ํ•ต์‹ฌ 3๊ฐ€์ง€

 

 2.2.1 ์™„์ „ ํƒ์ƒ‰(Brute Force )

- ๋ชจ๋“  ๋†’์ด(0๋ถ€ํ„ฐ ์ตœ๊ณ  ๋†’์ด๊นŒ์ง€)๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์‹œํ—˜ํ•ด๋ด„

- ๋†’์ด๋งˆ๋‹ค BFS๋กœ ์ „์ฒด ์˜์—ญ์„ ์ƒˆ๋กœ ํƒ์ƒ‰

 

 2.2.2 BFS (๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

- ๊ฐ ์•ˆ์ „ํ•œ ์˜์—ญ์€ ์—ฐ๊ฒฐ๋œ ์นธ๋“ค์˜ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ BFS๋กœ ์—ฐ๊ฒฐ๋œ ์นธ๋“ค์„ ํ•œ ๋ฒˆ์— ํƒ์ƒ‰

- ํƒ์ƒ‰์ด ํ•œ ๋ฒˆ ๋๋‚˜๋ฉด "์˜์—ญ 1๊ฐœ ๋ฐœ๊ฒฌ"

 

 2.2.3 ์‹œ๋ฎฌ๋ ˆ์ด์…˜

- ๋น„๊ฐ€ ์™”์„ ๋•Œ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฌธ์ œ

- map ๋ฐฐ์—ด์€ ๋ฐ”๊พธ์ง€ ์•Š๊ณ , visited์™€ height๋กœ ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

 


3.1 ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์‚ฌ๊ณ  ํ๋ฆ„ ์ •๋ฆฌ

  3.1.1 ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰ํ• ๊นŒ? - ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•จ

  3.1.2 ์–ด๋””์„œ ์‹œ์ž‘ํ•˜๊ณ  ์–ด๋””๊นŒ์ง€ ๊ฐ€์•ผ ํ•˜์ง€? - (0,0)์—์„œ (N-1, N-1)๊นŒ์ง€ ๋„๋‹ฌํ•ด์•ผ ํ•จ

  3.1.3 ์ด๋ฏธ ๊ฐ”๋˜ ์นธ์€ ๋‹ค์‹œ ๊ฐ€์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด? - visited[x][y] ๋ฐฐ์—ด ์‚ฌ์šฉ

  3.1.4  ์–ด๋–ค ์ˆœ์„œ๋กœ ์นธ๋“ค์„ ํ™•์ธํ•˜์ง€? - BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๊นŒ์šด ์นธ๋ถ€ํ„ฐ ํƒ์ƒ‰

  3.1.5 ๋„์ฐฉ์ง€์— ๋„๋‹ฌํ•˜๋ฉด?-> ํƒ์ƒ‰ ์ข…๋ฃŒํ•˜๊ณ  true ๋ฐ˜ํ™˜

 

3.2 ๋‘๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์‚ฌ๊ณ  ํ๋ฆ„ ์ •๋ฆฌ(์ƒ๊ฐ ์ˆœ์„œ)

 3.2.1 "๋น„๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ฌ๊นŒ" -> ๋ชจ๋“  ๋†’์ด๋ฅผ ๋‹ค ์‹œ๋„ํ•ด๋ณด์ž.

 3.2.2 "๋ฌผ์ด ์ด๋งŒํผ ์ฐจ๋ฉด ์–ด๋””๊ฐ€ ์ž ๊ธธ๊นŒ" -> map[x][y] <= height๋ฉด ์ž ๊น€. 

 3.2.3 "์ž ๊ธฐ์ง€ ์•Š์€ ์นธ๋“ค์€ ์—ฐ๊ฒฐ๋ผ ์žˆ์„๊นŒ" -> ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ ํ•„์š”.

 3.2.4 "ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์ง€?" -> BFS/DFS๋กœ ๋ฉ์–ด๋ฆฌ ํ•˜๋‚˜๋ฅผ ์ฐพ์ž!

 3.2.5 "์ด๊ฑธ ๋†’์ด๋ณ„๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๊ฒ ๋„ค!"

 

 


4.1 ์ฒซ ๋ฒˆ์žฌ ๋ฌธ์ œ์˜ ์ˆ˜ํ•™์  ์‚ฌ๊ณ (๊ทธ๋ž˜ํ”„ ์ด๋ก  ๊ธฐ๋ฐ˜)

 4.1.1 2์ฐจ์› ๋ฐฐ์—ด์€ ๊ทธ๋ž˜ํ”„์˜ ํ˜•ํƒœ๋กœ ๋ชจ๋ธ๋ง ๊ฐ€๋Šฅ

 4.1.2 ๊ฐ ์นธ์€ ๋…ธ๋“œ, ์ƒํ•˜์ขŒ์šฐ๋Š” ๊ฐ„์„ 

 4.1.3 BFS๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 4.1.4 ์ถœ๋ฐœ์ ๋ถ€ํ„ฐ ๊ฐ„์„  ํ•˜๋‚˜์”ฉ ํƒ€๋ฉด์„œ ํผ์ ธ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋„์ฐฉ์ ์— ๊ฐ€์žฅ ๋จผ์ € ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์Œ

 

4.2 ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์ˆ˜ํ•™์  ์‚ฌ๊ณ  (๊ทธ๋ž˜ํ”„ ์ด๋ก  ๊ธฐ๋ฐ˜)

 4.2.1 2์ฐจ์› ๋ฐฐ์—ด์€ ๊ทธ๋ž˜ํ”„์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋œ ์ •์ ์˜ ์ง‘ํ•ฉ

 4.2.2 ๊ฐ ์นธ์€ ์ •์ , ์ƒํ•˜์ขŒ์šฐ๋Š” ๊ฐ„์„ 

 4.2.3 "๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์นธ"๋งŒ ๋‚จ๊ธด ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์—์„œ ์—ฐ๊ฒฐ๋œ ์ปดํฌ๋„ŒํŠธ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ!

 


5.1 ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์ฝ”๋“œ ์™ธ์šฐ๊ธฐ ํฌ์ธํŠธ ์š”์•ฝ

 

5.1.1 ๋ฐฉํ–ฅ ๋ฐฐ์—ด- ์ƒ์šฐํ•˜์ขŒ ์ˆœ์„œ

int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};

 

 

 

5.1.2 ์ž๋ฃŒ ์ค€๋น„ - ์ค„(Queue)๊ณผ ๋ฐœ์ž๊ตญ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ

Queue<int[]> queue = new LinkedList<>();
boolean[][] visited = new boolean[N][N];

 

 

 

5.1.3 ์‹œ์ž‘์  ํ์— ์ถ”๊ฐ€ - ์ถœ๋ฐœ์ ์€ ํ์— ๋„ฃ๊ณ , ๋ฐฉ๋ฌธ ํ‘œ์‹œ

queue.add(new[]{startX,startY});
visited[startX][startY] = true;
๋ฒ”์œ„ ์•ˆ์ด๊ณ , ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ๊ณ , ๊ธธ์ด๋ฉด => ํ์— ์ถ”๊ฐ€ + ๋ฐฉ๋ฌธ ํ‘œ์‹œ

 

 

 

5.1.4 ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ BFS ํƒ์ƒ‰ - ์ค„์—์„œ ๊บผ๋‚ด๊ณ , ๋„์ฐฉํ–ˆ์œผ๋ฉด true

while (!queue.isEmpty()) {
   int[] current = queue.poll();
   int x = current[0];
   int y = current[1];
   
   if (x == N -1 && y = N -1) return true;

 

 

 

5.1.5 ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ - ๋ฒ”์œ„ ์•ˆ์ด๊ณ , ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ๊ณ , ๊ธธ์ด๋ฉด -> ํ์— ์ถ”๊ฐ€ + ๋ฐฉ๋ฌธ ํ‘œ์‹œ

for (int i = 0; i < 4; i++) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    
    if (nx>=0 && nx < N && ny >= 0 && ny < N
        && !visited[nx][ny] && maze[nx][ny] ==1){
        queue.offer(new int[]{nx,ny});
        visited[nx][ny] = true;
        }
    }
  }

 

 

5.1.6 ๋‹ค ๋Œ์•˜๋Š”๋ฐ ๋„์ฐฉ ๋ชปํ•˜๋ฉด false

return false;

5.2 ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ์˜ ์ฝ”๋“œ ์™ธ์šฐ๊ธฐ ํฌ์ธํŠธ ์š”์•ฝ

 

 5.2.1 ๋ฐฉํ–ฅ ๋ฐฐ์—ด - ์ƒ, ์šฐ, ํ•˜, ์ขŒ ์ˆœ์„œ๋Œ€๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •!

x↓   y→
    0   1   2   3
  +---+---+---+---+
0 |   |   |   |   |
  +---+---+---+---+
1 |   |   |   |   |
  +---+---+---+---+
2 |   |   |   |   |
  +---+---+---+---+
3 |   |   |   |   |
  +---+---+---+---+


//          ์ƒ  ํ•˜  ์šฐ  ์ขŒ
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};

 

 

 5.2.2 ๋†’์ด๋ณ„ ์ „์ฒด ๋ฐ˜๋ณต

for (int height = 0; height <= maxHeight; height++) {
    visited = new boolean[N][N];
    safeZones = 0;
    
    // ์ „์ฒด map ํƒ์ƒ‰ํ•ด์„œ ์•„์ง ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ๊ณ  ๋ฌผ์— ์•ˆ ์ž ๊ธด ์นธ์—์„œ BFS
}
๊ฐ ๋†’์ด๋งˆ๋‹ค ์ƒˆ๋กœ visited ์ดˆ๊ธฐํ™”
ํ•œ ์นธ์ด๋ผ๋„ BFS ์‹œ์ž‘ํ•˜๋ฉด safeZone++

 

 

5.2.3 BFS ๊ตฌ์กฐ๋Š” ๋ฏธ๋กœ์—์„œ ์ผ๋˜ ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™์Œ!

Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{x, y});
visited[x][y] = true;
๊บผ๋‚ด๋ฉด์„œ ๋„ค ๋ฐฉํ–ฅ ์ฒดํฌ
์กฐ๊ฑด ๋งž์œผ๋ฉด ์ค„์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ. 

 


 

6. ์•”๊ธฐํ•˜๋Š” ๋‚˜๋งŒ์˜ ๊ณต์‹

 

6.1 ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ

1. ๋ฐฉํ–ฅ ๋ฐฐ์—ด ๋จผ์ € ๋งŒ๋“ค๊ธฐ
2. ์ค„๊ณผ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
3. ์‹œ์ž‘์  ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ํ‘œ์‹œ
4. ์ค„ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต:
  - ํ•˜๋‚˜ ๊บผ๋‚ด์„œ ํ˜„์žฌ ์œ„์น˜ ํ™•์ธ
  - ๋„์ฐฉ์ ์ด๋ฉด true ๋ฐ˜ํ™˜
 - ๋„ค ๋ฐฉํ–ฅ ํ™•์ธ : ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
5. ๋„์ฐฉ ๋ชป ํ–ˆ์œผ๋ฉด false

 

6.2 ๋‘๋ฒˆ์งธ ๋ฌธ์ œ

1. maxHeight๊นŒ์ง€ height ํ•˜๋‚˜์”ฉ ๋Œ๋ ค
2. visited ๋ฐฐ์—ด์€ ๋†’์ด๋งˆ๋‹ค ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ 
3. ๋ชจ๋“  ์นธ์„ ๋Œ๋ฉฐ, ์•ˆ ์ž ๊ฒผ๊ณ , ๋ฐฉ๋ฌธ ์•ˆํ–ˆ์œผ๋ฉด BFS ์‹œ์ž‘! , safeZone++
4. BFS๋Š” ๋„ค ๋ฐฉํ–ฅ ๋Œ๋ฉฐ, ๋ฒ”์œ„ ์•ˆ, ๋ฐฉ๋ฌธ ์•ˆ ํ–ˆ๊ณ , height๋ณด๋‹ค ๋†’์€ ๊ณณ์ด๋ฉด ์ค„์— ์ถ”๊ฐ€
5. height๋ณ„ safeZone ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ

 

 


 

7.  ์ด ๋ฌธ์ œ์—์„œ ๋ฐฐ์šด ๋…ผ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” BFS ๋ฌธ์ œ ํŒจํ„ด

๋ฌธ์ œ ํ•ต์‹ฌ๊ฐœ๋…
์„ฌ์˜ ๊ฐœ์ˆ˜ (๋ฐฑ์ค€ 4963)
https://www.acmicpc.net/problem/4963
์—ฐ๊ฒฐ๋œ ๋ฉ์–ด๋ฆฌ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ (๋ฌผ ๋Œ€์‹  ๋ฐ”๋‹ค)
๋‹จ์ง€ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ (๋ฐฑ์ค€ 2667)
https://www.acmicpc.net/problem/2667
1๋กœ ์—ฐ๊ฒฐ๋œ ์ง‘ ๊ทธ๋ฃน ์„ธ๊ธฐ
๋ฏธ๋กœ ํƒ์ƒ‰ (2178)
https://www.acmicpc.net/problem/2178
์ตœ๋‹จ๊ฑฐ๋ฆฌ ํƒ์ƒ‰
์œ ๊ธฐ๋† ๋ฐฐ์ถ” (1012)
https://www.acmicpc.net/problem/1012
๋ฐฐ์ถ” ๋ญ‰์น˜ ๊ฐœ์ˆ˜ (DFS/BFS)
๋ฐ”์ด๋Ÿฌ์Šค ํผ์ง€๊ธฐ ๊ฐ์—ผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (ํ, visited, ์กฐ๊ฑด)

+ Recent posts