본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

백준 문제풀이/Nodejs

[백준][bfs] 2146 다리 만들기 NodeJs 구현

by 꽁이꽁설꽁돌 2025. 1. 19.
728x90
반응형

 

     

목차

  1. 문제
  2. 문제 구현 방향
  3. 문제 구현 시 주의점
  4. 코드 구현

 

https://www.acmicpc.net/problem/2146

문제

 

 

문제 구현 방향

bfs를 통해 사전 탐색을 하여 각 영역을 표시 해 준 뒤 bfs를 한번 더 해서 최소 거리를 구해 주었다.

 

 

문제 구현 시 주의점

두번째 bfs를 할때 탐색 불가 조건을 철저하게 해주어야 한다.

그렇지 않으면 틀리게 된다.

 

 

코드 구현

javascript
const input = require("fs")
  .readFileSync("./dev/stdin", "utf-8")
  .trim()
  .split("\n");

let N = +input[0];

let idx = 1;
let board = [];

while (idx < input.length) {
  let t = input[idx].trim().split(" ").map(Number);
  board.push(t);
  idx++;
}

let dx = [0, 0, 1, -1];
let dy = [1, -1, 0, 0];
let ans = 100000000;
let boardF = Array.from({ length: N }, () => Array(N).fill(0));


function bfs( startX, startY, flag) {
  let queue = [];
  boardF[startY][startX] = flag;
  queue.push([startX, startY]);
  while (queue.length) {
    let [x, y] = queue.shift();
    for (let i = 0; i < 4; i++) {
      let nx = x + dx[i];
      let ny = y + dy[i];
      if (nx < 0 || nx > N - 1 || ny < 0 || ny > N - 1) continue;
      if (boardF[ny][nx] != 0 || !board[ny][nx]) continue;
      queue.push([nx, ny]);
      boardF[ny][nx] = flag;
    }
  }
}

function bfs2(startX, startY) {
  let area = boardF[startY][startX];
  let visit = Array.from({ length: N }, () => Array(N).fill(0));
  let queue = [];

  visit[startY][startX] = 1;
  queue.push([startX, startY]);

  while (queue.length) {
    let [x, y] = queue.shift();
    for (let i = 0; i < 4; i++) {
      let nx = x + dx[i];
      let ny = y + dy[i];
      if (nx < 0 || nx > N - 1 || ny < 0 || ny > N - 1) continue;
      if (visit[ny][nx] || boardF[ny][nx] === area) continue;
      if (boardF[ny][nx] !== 0 && boardF[ny][nx] !== area) {
        ans = Math.min(visit[y][x]-1, ans);
        continue;
      }
      queue.push([nx, ny]);
      visit[ny][nx] = visit[y][x] + 1;
    }
  }
}



let flag = 1;
for (let i = 0; i < N; i++) {
  for (let j = 0; j < N; j++) {
    if (boardF[i][j] === 0 && board[i][j] !== 0) {
      bfs( j, i, flag);
      flag++;
    }
  }
}

for (let i = 0; i < N; i++) {
  for (let j = 0; j < N; j++) {
    if (boardF[i][j] !== 0) {
      bfs2(j, i);
    }
  }
}

console.log(ans);

 

 

 

반응형