백준 2178 미로 탐색

걍걍규·2023년 10월 12일
0
post-thumbnail

문제 설명

입출력 예시

문제 접근법

아주 기초적이고 간단한 BFS를 이용한 문제였고 문제를 보고 정리를 해보았다

  • 시작점은 문제에선 (1,1)으로 나와있지만 (0,0)으로 생각하는게 이해하기 편했고 N, M도 마찬가지로 N-1, M-1로 생각했다
  • 예시는 모두 시작점이 좌측 상단의 끝이고 도착점이 우측 하단의 끝이였다 즉 엣지케이스는 없으니 대충 하나 잡고 봐도 될 듯 했다
  • 1이면 접근 가능 0이면 접근 불가능하다는 것 그리고 N, M은 도착점이 우측 하단의 끝이 아닐수도 있다는 점을 생각하였다
  • 그럼 이제 BFS를 구현해서 문제를 풀어보자 !
  • 여기까지 정리 하는데 5분이 걸렸다
const fs = require('fs');
const input = fs.readFileSync('example.txt', 'utf-8').trim().split('\n');

const [N, M] = input.shift().split(' ');

const graph = input.map((el) => el.split('').map((el2) => +el2));

const dirs = [
  [-1, 0],
  [1, 0],
  [0, -1],
  [0, 1],
];

const visited = Array.from({ length: graph.length }, () =>
  Array.from({ length: graph[0].length }, () => false)
);
const cntGraph = Array.from({ length: graph.length }, () =>
  Array.from({ length: graph[0].length }, () => 0)
);

const bfs = (x, y) => {
  const queue = [];
  queue.push([x, y]);
  visited[x][y] = true;
  cntGraph[x][y] += 1;

  while (queue.length !== 0) {
    const [curX, curY] = queue.shift();
    for (const dir of dirs) {
      const [nextX, nextY] = [curX + dir[0], curY + dir[1]];
      if (
        nextX >= 0 &&
        nextY >= 0 &&
        nextX < graph.length &&
        nextY < graph[0].length &&
        visited[nextX][nextY] === false &&
        graph[nextX][nextY] === 1
      ) {
        visited[nextX][nextY] = true;
        queue.push([nextX, nextY]);
        cntGraph[nextX][nextY] = cntGraph[curX][curY] + 1;
      }
    }
  }
};

bfs(0, 0);

console.log(cntGraph[N - 1][M - 1]);
  • 특이점이라고 한다면 cntGraph[nextX][nextY] = cntGraph[curX][curY] + 1; 이 부분에서 이전 좌표를 가져와서 거기에 1씩 더해주는 모습이라고 볼 수 있겠다

마무리

프로젝트 핑계로 알고리즘에 소홀했고 BFS를 어느정도 다룰줄 알게 되었다고 다른 알고리즘에 눈을 돌렸는데 ..

사실 BFS도 좀만 조건이 추가된다면 엣지케이스 예상이 어려워지기도 하고 조건 먹이는것도 어려워서 잘못한다 그러니까 조금이라도 할 줄 아는걸 더 갈고닦고 가보자

풀이 시간 1시간

profile
안녕하시오?

0개의 댓글