Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

연습장/백준(BOJ) 문제풀이

[백준 4963] 섬의 개수 with Node.js

2021. 8. 16. 12:45

문제 링크

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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

풀이

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const iterator = input[Symbol.iterator]();
const dfs = (w, h, arr, visited, start) => {
  const offsetX = [-1, 0, 1, -1, 1, -1, 0, 1];
  const offsetY = [-1, -1, -1, 0, 0, 1, 1, 1];
  const stack = [start];
  while (stack.length) {
    const node = stack.pop();
    if (!visited[node]) {
      visited[node] = true;
      const [ x, y ] = [ node%w, Math.floor(node/w) ];
      offsetX.forEach((_, i) => {
        const [ dx, dy ] = [ x + offsetX[i], y + offsetY[i] ];
        const newNode = dx + dy*w;
        if (dx >= 0 && dx < w && dy >= 0 && dy < h && !visited[newNode] && arr[dy][dx]) {
          stack.push(newNode);
        }
      });
    }
  }
};

while (true) {
  const iterResult = iterator.next();
  if (iterResult.value === '0 0') break;
  const [ w, h ] = iterResult.value.split(' ').map(v => +v);
  const arr = [];
  const visited = new Array(w*h).fill(false);
  let count = 0;
  for (let i=0; i<h; i++) {
    arr.push(iterator.next().value.split(' ').map(v => +v));
  }
  for (let i=0; i<w*h; i++) {
    if (!visited[i] && arr[Math.floor(i/w)][i%w]) {
      dfs(w, h, arr, visited, i);
      count++;
    }
  }
  console.log(count);
}

그래프의 연결 요소(Connected Component)의 개수를 묻는 문제이므로,

visited를 순회하면서 아직 방문하지 않은 땅에 대해 dfs를 실행하고 그 횟수를 출력한다.

 

이렇게 하면 어떤 섬의 땅 하나에서 dfs를 실행하여 그 섬의 모든 땅을 방문하고,

계속 visited 순회를 진행하면서 새로운 섬의 땅 하나에서 또 dfs를 실행하게 된다.

따라서, dfs를 실행한 횟수가 곧 섬의 개수이다.

 

dfs에서는 가로 세로 대각선 8개 방향에 대해 아직 방문하지 않은 땅이면 stack에 push하여 방문하도록 하였다. 

 

저작자표시 비영리 (새창열림)

'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글

[백준 15656] N과 M (7) with Node.js  (0) 2021.08.19
[백준 1932] 정수 삼각형 with Node.js  (0) 2021.08.18
[백준 15655] N과 M (6) with Node.js  (0) 2021.08.16
[백준 2512] 예산 with Node.js  (0) 2021.08.14
[백준 9613] GCD 합 with Node.js  (0) 2021.08.13
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 15656] N과 M (7) with Node.js
    • [백준 1932] 정수 삼각형 with Node.js
    • [백준 15655] N과 M (6) with Node.js
    • [백준 2512] 예산 with Node.js
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바