๐Ÿ’ก๋ฌธ์ œ ๋ถ„์„ ์š”์•ฝ

๐Ÿ’ก์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

๐Ÿ’ก์ฝ”๋“œ

const fs = require('fs');
const path = require('path');

const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');

function solution(input) {
  // ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜ T๋กœ, ๋‚˜๋จธ์ง€๋Š” ๊ฐ๊ฐ์˜ ์ผ€์ด์Šค๋กœ ๋ถ„๋ฆฌ
  const [T, ...cases] = input;

  // ์ƒ, ํ•˜, ์ขŒ, ์šฐ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด
  const directions = [
    [-1, 0], [1, 0], [0, -1], [0, 1] // ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ
  ];

  // DFS ํ•จ์ˆ˜: ํ˜„์žฌ ์œ„์น˜ (x, y)์—์„œ ์‹œ์ž‘ํ•ด ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋ฐฐ์ถ”๋ฅผ ๋ฐฉ๋ฌธ
  const dfs = (x, y, grid, visited, N, M) => {
    // ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[x][y] = true;

    // ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์ด๋™
    for (let [dx, dy] of directions) {
      const nx = x + dx;  // ์ƒˆ๋กœ์šด x์ขŒํ‘œ
      const ny = y + dy;  // ์ƒˆ๋กœ์šด y์ขŒํ‘œ

      // ์œ ํšจํ•œ ์ขŒํ‘œ ๋‚ด์— ์žˆ๊ณ , ๋ฐฐ์ถ”๊ฐ€ ์žˆ์œผ๋ฉฐ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํƒ์ƒ‰
      if (nx >= 0 && ny >= 0 && nx < N && ny < M && grid[nx][ny] === 1 && !visited[nx][ny]) {
        dfs(nx, ny, grid, visited, N, M); 
      }
    }
  };

  
  let idx = 0;  // ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค
  let result = [];  // ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด

  // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
  for (let t = 0; t < T; t++) {
    // ๊ฐ€๋กœ M, ์„ธ๋กœ N, ๋ฐฐ์ถ”์˜ ๊ฐœ์ˆ˜ K ์ถ”์ถœ
    const [M, N, K] = cases[idx].split(' ').map(Number);

    idx++;

    // ๋†์žฅ์„ ํ‘œํ˜„ํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด(grid)์™€ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด(visited) ์ดˆ๊ธฐํ™”
    const grid = Array.from({ length: N }, () => Array(M).fill(0));
    const visited = Array.from({ length: N }, () => Array(M).fill(false));

    // ๋ฐฐ์ถ” ์‹ฌ๊ธฐ
    for (let i = 0; i < K; i++) {
      const [x, y] = cases[idx].split(' ').map(Number);
      grid[y][x] = 1;  // ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ง„ ์ขŒํ‘œ๋ฅผ 1๋กœ ํ‘œ์‹œ
      idx++;
    }

    let count = 0;  // ๊ตฐ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜

    // ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋Œ๋ฉด์„œ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ DFS ํƒ์ƒ‰
    for (let i = 0; i < N; i++) {
      for (let j = 0; j < M; j++) {
        if (grid[i][j] === 1 && !visited[i][j]) {
          dfs(i, j, grid, visited, N, M);  
          // ๋ฐฐ์ถ” ๊ตฐ์ง‘ ํƒ์ƒ‰
          
          count++;  
          // ํ•˜๋‚˜์˜ ๊ตฐ์ง‘์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ์นด์šดํŠธ ์ฆ๊ฐ€
        }
      }
    }

    // ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ๊ตฐ์ง‘ ์ˆ˜ ์ถ”๊ฐ€
    result.push(count);
  }

  console.log(result.join('\\n'));
}

solution(input);

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