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) 문제풀이

[백준 2667] 단지번호붙이기 with Node.js

2021. 8. 9. 14:00

문제 링크

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

풀이

const getCount = (start, visited, house) => {
  const offsetX = [-1, 0, 0, 1];
  const offsetY = [0, -1, 1, 0];
  const getXY = (idx) => [idx%N, Math.floor(idx/N)];
  const getIdx = (x, y) => x + y*N;
  const isValid = (x, y) => x >= 0 && x < N && y >= 0 && y < N;

  const stack = [start];
  const graph = [];
  let count = 0;

  while (stack.length) {
    const node = stack.pop();
    const [x, y] = getXY(node);
    if (!visited[node] && house[y][x] === '1') {
      visited[node] = true;
      graph.push(node);
      count++;
      offsetX.forEach((_, i) => {
        const [dx, dy] = [x + offsetX[i], y + offsetY[i]];
        const newNode = getIdx(dx, dy);
        if (isValid(dx, dy)) {
          stack.push(newNode);
        }
      });
    }
  }
  return count;
};

const solve = (N, house) => {
  const visited = new Array(N*N).fill(false);
  const output = [];
  visited.forEach((v, i) => {
    if (!v) {
      const count = getCount(i, visited, house);
      if (count > 0) output.push(count);
    }
  });
  console.log(output.length);
  console.log(output.sort((a, b) => a - b).join('\n'));
};

const [N, ...input] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const house = input.map(row => row.split(''));
solve(N, house);

방문 여부를 나타내는 visited를 모두 false로 채우고 순회한다.

false일 경우 getCount에서 DFS를 통해 집의 개수를 세서 반환한다.

이 때 시작점이 집이 아니면 0을 반환하므로, count가 0보다 클 경우에만 output에 단지에 속한 집의 수를 저장한다.

 

DFS를 하면서 방문했던 곳의 visited를 true로 바꾸므로,

visited를 순회하면서 true인 곳은 지나치고 false인 곳에서 다시 getCount를 반복한다.

 

최종적으로 output의 개수와 output을 정렬한 각 원소를 출력한다.

 

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

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

[백준 9613] GCD 합 with Node.js  (0) 2021.08.13
[백준 15654] N과 M (5) with Node.js  (0) 2021.08.12
[백준 11659] 구간 합 구하기 4 with Node.js  (0) 2021.08.09
[백준 5052] 전화번호 목록 with Python  (0) 2021.08.03
[백준 1927] 최소 힙 with Python  (0) 2021.08.02
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 9613] GCD 합 with Node.js
    • [백준 15654] N과 M (5) with Node.js
    • [백준 11659] 구간 합 구하기 4 with Node.js
    • [백준 5052] 전화번호 목록 with Python
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바