๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€] ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

by hossii 2024. 11. 18.

1. ๋ฌธ์ œ ์š”์•ฝ

  • N x M ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ์ง€๋„๊ฐ€ ์žˆ๊ณ , ๊ฐ ์ขŒํ‘œ๋Š” 0๊ณผ 1๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • 0: ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ
    • 1: ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ
  • ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋™ํ•˜๋Š” ์ค‘์— ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • (1, 1)์—์„œ ์‹œ์ž‘ํ•ด (N, M)๊นŒ์ง€ ๊ฐ€๊ณ ์ž ํ•  ๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ

  • int N
  • int M
  • int[][] map

๋ฐ˜ํ™˜ ํƒ€์ž…

  • int distance

์˜ˆ์ œ

  • N: 6
  • M: 4
  • map
    • 0100
    • 1110
    • 1000
    • 0000
    • 0111
    • 0000

์ฃผ์˜ ์‚ฌํ•ญ

  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•ด ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฌธ์ œ ํ’€์ด

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Queue;

public class Main {

  public static void main(String[] args) throws IOException {
    try (
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    ) {
      String[] NM = br.readLine().split(" ");
      int ROW = Integer.parseInt(NM[0]);
      int COL = Integer.parseInt(NM[1]);
      int[][] map = new int[ROW + 1][COL + 1];
      boolean[][][] isVisited = new boolean[ROW + 1][COL + 1][2];

      for (int row = 1; row <= ROW; row++) {
        char[] rowValues = br.readLine().toCharArray();
        for (int col = 1; col <= COL; col++) {
          map[row][col] = Character.getNumericValue(rowValues[col - 1]);
        }
      }

      int result = findShortestDistance(map, isVisited, ROW, COL);

      bw.write(String.valueOf(result));
    }
  }

  private static int findShortestDistance(int[][] map, boolean[][][] isVisited, int ROW, int COL) {
    Node node = new Node();
    int[] dRow = {1, 0, -1, 0};
    int[] dCol = {0, 1, 0, -1};
    Queue<Node> queue = new ArrayDeque<>();
    queue.offer(node);
    isVisited[node.row][node.col][node.cheatCount] = true;

    while (!queue.isEmpty()) {
      Node cur = queue.poll();

      if (cur.row == ROW && cur.col == COL) {
        return cur.distance;
      }

      if (map[cur.row][cur.col] == 0) {
        for (int i = 0; i < 4; i++) {
          int row = cur.row + dRow[i];
          int col = cur.col + dCol[i];
          if (isInBound(row, col, ROW, COL) && !isVisited[row][col][cur.cheatCount]) {
            queue.offer(new Node(row, col, cur.distance + 1, cur.cheatCount));
            isVisited[row][col][cur.cheatCount] = true;
          }
        }
      } else {
        for (int i = 0; i < 4; i++) {
          int row = cur.row + dRow[i];
          int col = cur.col + dCol[i];
          if (cur.cheatCount == 0 && isInBound(row, col, ROW, COL) && !isVisited[row][col][0]) {
            queue.offer(new Node(row, col, cur.distance + 1, 1));
            isVisited[row][col][1] = true;
          }
        }
      }
    }

    return -1;
  }

  private static boolean isInBound(int row, int col, int ROW, int COL) {
    return 1 <= row && row <= ROW && 1 <= col && col <= COL;
  }

  static class Node {
    int row = 1;
    int col = 1;
    int distance = 1;
    int cheatCount = 0;

    public Node() {
    }

    public Node(int row, int col, int distance, int cheatCount) {
      this.row = row;
      this.col = col;
      this.distance = distance;
      this.cheatCount = cheatCount;
    }
  }

}

์‹œ๊ฐ„ ๋ณต์žก๋„

  • BFS ํƒ์ƒ‰์— ๋Œ€ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„
    • DFS/BFS ์‹œ๊ฐ„๋ณต์žก๋„๋Š” `O(๋…ธ๋“œ ์ˆ˜ + ์–‘๋ฐฉํ–ฅ ๊ฐ„์„  ์ˆ˜)`๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ง€๋„์˜ ๋…ธ๋“œ ์ˆ˜๋Š” `ROW x COL` ์ด๊ณ , ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” `2`๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋…ธ๋“œ์˜ ์ˆ˜๋Š” `ROW x COL x 2` ์ž…๋‹ˆ๋‹ค.
    • ์ตœ๋Œ€ 4๊ฐœ์˜ ๋ฐฉํ–ฅ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ„์„  ์ˆ˜๋Š” `4 x ๋…ธ๋“œ ์ˆ˜` = `8 x ROW x COL` ์ž…๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: `O(ROW X COL)`

'๐Ÿ’ฏ ์•Œ๊ณ ๋ฆฌ์ฆ˜ > ๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€] ๋ฆฌ๋ชจ์ปจ  (0) 2024.11.14
[๋ฐฑ์ค€] ๊ฟ€ ๋”ฐ๊ธฐ  (2) 2024.11.13