본문 바로가기
Algorithm/문제풀이

[백준] 2178번 : 미로 탐색 (실버Ⅰ) by node.js

by 썸머워즈 2022. 4. 7.
반응형

▷ 문제 : 2178번 - 미로 탐색

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

▷ 해결 날짜 : 2022.04.07
▷ 소요 시간 : 50분
▷ 풀이 과정 :

이것 역시 [0,0] 부터 상하좌우를 탐색해 나가면서 [N,M] 까지의 최단거리를 구하는 문제이다.

 

우선 고민이 필요한 부분은 탐색을 둘째치고 어떻게 거리를 구하고 담아둘건지에 대해 방향을 잡아야했다.

그래서 그냥 간단하게 탐색용 배열 하나, 거리 저장용 배열 하나 두개를 만들고 어차피 한칸씩 움직이며 탐색을 하기 때문에 이전에 위치한 값의 + 1 을 해주면서 저장을 해 나가면 된다.

 

문제에서는 N, M 을 통한 배열의 크기가 주어지고, 각 0, 1로 이루어진 문자열이 주어져 이걸 배열에 넣고 시작하면 되겠다 싶어 순서대로 구현을 진행하였다.

 

▷ 구현

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

const ds = [[-1, 0], [1, 0], [0, 1], [0, -1]];
const [N, M] = input.shift().split(' ').map(Number);
const visit = [...Array(N)].map(e => Array(M).fill(0));
const graph = [];
for(let i = 0; i < N ; i++){
  graph.push([...input[i].replace(/\r/g,'').split('').map(Number)]);
}

const queue = [[0, 0]];
visit[0][0] = 1;
while(queue.length){
  const [x, y] = queue.shift();
  if(!graph[x][y]) continue;
  graph[x][y] = 0; // 방문 처리
  for(let i = 0; i < 4 ; i++){
    const xPos = x + ds[i][0];
    const yPos = y + ds[i][1];

    if(xPos < 0 || yPos < 0 || xPos >= N || yPos >= M) continue;
    if(graph[xPos][yPos]){
      queue.push([xPos, yPos]);
      visit[xPos][yPos] = visit[x][y] + 1;
    }
  }
}

console.log(visit[N-1][M-1]);

 

▷ 복기 :

백준에는 nodeJS로 문제를 푸는사람이 많이 없나보다...

몇 없는 다른 사람들 코드를 봐도 대충 다 비슷하게 풀었다.

 

그래도 방향은 비슷한데 서로 다르게 푸는 코드를 보면 참 재밌다 배우는것도 많고

반응형


댓글

TOP