Python/백준

[JS] 소가 길을 건너간 이유6

728x90

그래프와 DFS를 활용한 풀이

 

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

 

14466번: 소가 길을 건너간 이유 6

첫 줄에 N, K, R이 주어진다. 다음 R줄에는 한 줄에 하나씩 길이 주어진다. 길은 상하좌우로 인접한 두 목초지를 잇고, r c r′ c′의 형태 (행, 열, 행, 열)로 주어진다. 각 수는 1 이상 N 이하이다.

www.acmicpc.net

 

 

 

소와 소를 만나는 과정을 DFS를 활용해서 구하되 가는 길에 다리가 있다면 건너지 않으면 된다.

 

1. 그래프 설정하기

2. 소를 1:1 대응으로 찾을 수 있는지 분리

3. 각 대응마다 DFS를 활용하여 소에서 소로 갈 수 있는지 확인

 

 

includes는 배열의 1차까지만 비교하기 때문에 find를 활용해서 찾아야 한다!

 

 

 

 

const fs = require("fs");
const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n")
  .map((v) => v.split(" ").map((v) => +v));

const [n, k, r] = input[0];

//그래프 생성
const graph = [...Array(n)].map((_) => [...Array(n)].map((_) => []));
for (let i = 1; i < r + 1; i++) {
  const [sr, sc, er, ec] = input[i].map((v) => v - 1);
  graph[sr][sc].push([er, ec]);
  graph[er][ec].push([sr, sc]);
}
//소 정보 저장
const cowInfo = [];
for (let i = r + 1; i < r + 1 + k; i++) {
  const [r, c] = input[i].map((v) => v - 1);
  cowInfo.push([r, c]);
}

const dr = [1, 0, -1, 0];
const dc = [0, 1, 0, -1];
//소-소로 갈수있는지 판별
const dfs = (ary, sR, sC, eR, eC) => {
  const stk = [[sR, sC]];
  ary[eR][eC] = "e";
  while (stk.length) {
    const [r, c] = stk.pop();
    if (ary[r][c] === 1) continue;
    if (ary[r][c] === "e") return true;
    ary[r][c] = 1;

    for (let d = 0; d < 4; d++) {
      const [nR, nC] = [r + dr[d], c + dc[d]];
      if (!(0 <= nR && nR < n && 0 <= nC && nC < n)) continue;
      if (graph[r][c].find((v) => v[0] === nR && v[1] === nC)) continue;
      stk.push([nR, nC]);
    }
  }
  return false;
};

let ret = 0;

//소의 경우의수 마다 갈 수 있는지 계산
for (let i = 0; i < cowInfo.length - 1; i++) {
  for (let j = i + 1; j < cowInfo.length; j++) {
    const [sR, sC] = cowInfo[i];
    const [eR, eC] = cowInfo[j];
    const cowMap = [...Array(n)].map((_) => Array(n).fill(0));
    ret += dfs(cowMap, sR, sC, eR, eC) ? 0 : 1;
  }
}
console.log(ret);
728x90

'Python > 백준' 카테고리의 다른 글

[py] 17144_미세먼지 안녕!  (0) 2024.04.11
16236_아기상어  (0) 2022.07.10
16235_나무제테크  (0) 2022.07.10
16234_인구이동  (0) 2022.07.07
5373_큐빙  (0) 2022.07.06