let's get IT with DAVINA ๐Ÿ’ป

[๋ฐฑ์ค€ #1926] ๊ทธ๋ฆผ → BFS ํ™œ์šฉ ๋ณธ๋ฌธ

DEV_IN/๋ฌธ์ œํ’€์ด

[๋ฐฑ์ค€ #1926] ๊ทธ๋ฆผ → BFS ํ™œ์šฉ

๋‹ค๋นˆ์น˜์ฝ”๋“œ๐Ÿ’Ž 2023. 3. 22. 19:58

โ“ ๋ฌธ์ œ

์–ด๋–ค ํฐ ๋„ํ™”์ง€์— ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์žˆ์„ ๋•Œ, ๊ทธ ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜์™€, ๊ทธ ๊ทธ๋ฆผ ์ค‘ ๋„“์ด๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๊ฒƒ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด๋ผ๋Š” ๊ฒƒ์€ 1๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ํ•œ ๊ทธ๋ฆผ์ด๋ผ๊ณ  ์ •์˜ํ•˜์ž. ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์€ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์ด๊ณ  ๋Œ€๊ฐ์„ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์€ ๋–จ์–ด์ง„ ๊ทธ๋ฆผ์ด๋‹ค. ๊ทธ๋ฆผ์˜ ๋„“์ด๋ž€ ๊ทธ๋ฆผ์— ํฌํ•จ๋œ 1์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

๐Ÿ—๏ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n(1 ≤ n ≤ 500)๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m(1 ≤ m ≤ 500)์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1 ์ค„ ๊นŒ์ง€ ๊ทธ๋ฆผ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (๋‹จ ๊ทธ๋ฆผ์˜ ์ •๋ณด๋Š” 0๊ณผ 1์ด ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง€๋ฉฐ, 0์€ ์ƒ‰์น ์ด ์•ˆ๋œ ๋ถ€๋ถ„, 1์€ ์ƒ‰์น ์ด ๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค)

๐Ÿ—๏ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜, ๋‘˜์งธ ์ค„์—๋Š” ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋Š” 0์ด๋‹ค.

๐Ÿ—๏ธ ์˜ˆ์ œ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ

//์ž…๋ ฅ
6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1
//์ถœ๋ ฅ
4
9

โ—๏ธ ๋น„๋‹ˆ's ํ’€์ด

BFS๊ตฌํ˜„์˜ ๊ธฐ๋ณธ ์ •์„ ๋ฌธ์ œ๋ผ๋Š”๋ฐ ์ œ๋Œ€๋กœ ๊ฐœ๋…์„ ์ดํ•ด๋ชปํ•œ๊ฑด์ง€ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ˆ x๊ฐ€ ํ–‰์ธ์ง€, y๊ฐ€ ํ–‰์ธ์ง€๋ถ€ํ„ฐ ํ—ท๊ฐˆ๋ ค์„œ ๋จธ๋ฆฌ๊ฐ€ ๋ฝ€๊ฐœ์งˆ๊ฒƒ๊ฐ™๋‹ค...

const fs = require("fs");
let input = fs
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split("\n")
    .map((el) => el.split(" ").map((item) => +item));

//๋ณด๋“œ๋งŒ๋“ค๊ธฐ
const [n, m] = input.shift();
//๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ํ‘œ์‹œ์  ๋งŒ๋“ค๊ธฐ
const visited = Array.from({ length: n }, () => new Array(m).fill(false));
//์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ
let direction = [
    [1, 0],
    [-1, 0],
    [0, 1],
    [0, -1],
];

let answer = 0; //๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜
let result = []; //๊ทธ๋ฆผ์˜ ๋„“์ด

const BFS = (start) => {
    let queue = [start];
    let square = 0; //๊ทธ๋ฆผ์˜ ๋„“์ด
    while (queue.length) {
        let [y, x] = queue.shift();
        if (visited[y][x]) continue;
        visited[y][x] = true;
        square++;
        for (let i = 0; i < direction.length; i++) {
            let [dy, dx] = [y + direction[i][0], x + direction[i][1]]; //๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ ์‚ดํ”ผ๊ธฐ
            if (dy < 0 || dx < 0 || dy >= n || dx >= m) continue; //๋ณด๋“œํŒ์„ ๋ฒ—์–ด๋‚˜๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€
            if (visited[dy][dx]) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ๊ณณ์ด๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€
            if (input[dy][dx] === 1) {
                //๋ณด๋“œํŒ ๋‚ด์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ˆซ์ž1์ด์•ผ? ๊ทธ๋Ÿผ ํ์— ์ถ”๊ฐ€
                queue.push([dy, dx]);
            }
        }
    }
    if (square) {
        answer++;
        result.push(square);
    }
};

for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
        if (input[i][j] === 1 && !visited[i][j]) {
            //๋ณด๋“œํŒ ๋‚ด์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ฉด ๊ธฐ์ค€์ ์— ๋“ค์–ด๊ฐ€์ž
            BFS([i, j]);
        }
    }
}

if (!answer) return console.log(0 + "\n" + 0);
console.log(answer + "\n" + Math.max(...result));

⊕ Extra Knowledge ++

  • Array.from()
    • ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด(array-like object)๋‚˜ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(iterable object)๋ฅผ ์–•๊ฒŒ ๋ณต์‚ฌํ•ด ์ƒˆ๋กœ์šดArray ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
console.log(Array.from('foo'));
// Expected output: Array ["f", "o", "o"]

console.log(Array.from([1, 2, 3], x => x + x));
// Expected output: Array [2, 4, 6]

  • "123" → +"123" → 123(number type)

Array.map((item) => +item)); //์š”์†Œ๋“ค์„ number type์œผ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ
Comments