๋์ด๋: ๊ณจ๋ 3
ํ์ด ์๊ณ ๋ฆฌ์ฆ: BFS
๋ฌธ์
N×M์ ๋ชจ๋์ข ์ด ์์ ์์ฃผ ์์ ์น์ฆ๊ฐ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ํ์๋์ด ์๋ค. ๋จ, N ์ ์ธ๋ก ๊ฒฉ์์ ์์ด๊ณ , M ์ ๊ฐ๋ก ๊ฒฉ์์ ์์ด๋ค. ์ด ์น์ฆ๋ ๋๋ ๋ณด๊ด์ ํด์ผ๋ง ํ๋๋ฐ ์ค๋ด์จ๋์ ๋ด์ด๋์ผ๋ฉด ๊ณต๊ธฐ์ ์ ์ดํ์ฌ ์ฒ์ฒํ ๋ น๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๋ชจ๋์ข ์ด ๋ชจ์์ ์น์ฆ์์ ๊ฐ ์น์ฆ ๊ฒฉ์(์ ์ ์ ์ฌ๊ฐํ ๋ชจ์)์ 4๋ณ ์ค์์ ์ ์ด๋ 2๋ณ ์ด์์ด ์ค๋ด์จ๋์ ๊ณต๊ธฐ์ ์ ์ดํ ๊ฒ์ ์ ํํ ํ์๊ฐ๋ง์ ๋ น์ ์์ด์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์๋ <๊ทธ๋ฆผ 1> ๋ชจ์๊ณผ ๊ฐ์ ์น์ฆ(ํ์์ผ๋ก ํ์๋ ๋ถ๋ถ)๋ผ๋ฉด C๋ก ํ์๋ ๋ชจ๋ ์น์ฆ ๊ฒฉ์๋ ํ ์๊ฐ ํ์ ์ฌ๋ผ์ง๋ค.
<๊ทธ๋ฆผ 2>์ ๊ฐ์ด ์น์ฆ ๋ด๋ถ์ ์๋ ๊ณต๊ฐ์ ์น์ฆ ์ธ๋ถ ๊ณต๊ธฐ์ ์ ์ดํ์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ ๋ก ์ด ๊ณต๊ฐ์ ์ ์ดํ ์น์ฆ ๊ฒฉ์๋ ๋ น์ง ์๊ณ C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ง ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ ํ ์๊ฐ ํ, ์ด ๊ณต๊ฐ์ผ๋ก ์ธ๋ถ๊ณต๊ธฐ๊ฐ ์ ์ ๋๋ฉด <๊ทธ๋ฆผ 3>์์์ ๊ฐ์ด C๋ก ํ์๋ ์น์ฆ ๊ฒฉ์๋ค์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
๋ชจ๋์ข ์ด์ ๋งจ ๊ฐ์ฅ์๋ฆฌ์๋ ์น์ฆ๊ฐ ๋์ด์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์ N, M (5 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๋ชจ๋์ข ์ด ์์ ๊ฒฉ์์ ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋๊ณ , ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ์ 0์ผ๋ก ํ์๋๋ค. ๋ํ, ๊ฐ 0๊ณผ 1์ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
์ถ๋ ฅ
์ถ๋ ฅ์ผ๋ก๋ ์ฃผ์ด์ง ์น์ฆ๊ฐ ๋ชจ๋ ๋ น์ ์์ด์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ์ ์ ์๋ก ์ฒซ ์ค์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0
0 0 0 1 1 0 1 1 0
0 0 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 1 1 0 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
์์ ์ถ๋ ฅ 1
4
๐ ํ์ด ์ฝ๋
const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');
class Queue {
constructor() {
this.items = {};
this.headIndex = 0;
this.tailIndex = 0;
}
enqueue(item) {
this.items[this.tailIndex] = item;
this.tailIndex++;
}
dequeue() {
const item = this.items[this.headIndex];
delete this.items[this.headIndex];
this.headIndex++;
return item;
}
peek() {
return this.items[this.headIndex];
}
size() {
return this.tailIndex - this.headIndex;
}
}
const [n, m] = input[0].split(' ').map(Number);
const graph = input.slice(1).map((item) => item.split(' ').map(Number));
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
const removeCheese = () => {
let changed = false;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (graph[i][j] >= 3) {
graph[i][j] = 0;
changed = true;
}
if (graph[i][j] === 2) {
graph[i][j] = 1;
}
}
}
return changed;
};
let count = 0;
while (true) {
const visited = Array.from({ length: n }, () => Array(m).fill(false));
const queue = new Queue();
queue.enqueue([0, 0]);
visited[0][0] = true;
while (queue.size() !== 0) {
const [x, y] = queue.dequeue();
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (visited[nx][ny]) continue;
if (graph[nx][ny] >= 1) {
graph[nx][ny]++;
} else {
queue.enqueue([nx, ny]);
visited[nx][ny] = true;
}
}
}
if (removeCheese()) {
count++;
} else {
console.log(count);
return;
}
}
๐กํ์ด ํด์ค
๋ฌธ์ ํด๊ฒฐ์ ํต์ฌ ์์ด๋์ด๋ ์น์ฆ๊ฐ ๋ น์ ์์ด์ง ์ ์์ ๋๊น์ง BFS๋ฅผ ๋ฐ๋ณต ์ํ ํ๋ ๊ฒ์ด๋ค.
์น์ฆ๊ฐ ๋ น์ ์์ด์ง๊ธฐ ์ํด์๋ ์ธ๋ถ ๊ณต๊ธฐ์ ๋ ๋ฒ ์ด์ ๋ฟ์์ผ ํ๋ค.
์ผ์ชฝ ์๋จ๋ถํฐ ์์ํด์ ์น์ฆ๊ฐ ์๋ ๋ถ๋ถ ์ฆ, 0์ผ ๋๋ง ์, ํ, ์ข, ์ฐ๋ก ํผ์ ธ ๋๊ฐ ์ ์๊ฒ ํ๋ค.
๋ค์ ์ด๋ํ ๋ถ๋ถ์ ๋ํด์ ๋งต์ ํฌ๊ธฐ๋ฅผ ๋ฒ์ด๋๊ณ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ด๋ฉด ๊ฑด๋๋์ด์ค๋ค.
์ ์กฐ๊ฑด์ ํต๊ณผํ๋ฉด ํผ์ ธ๋๊ฐ๋ ๋์ค์ 1 ์ด์ ์ฆ, ์น์ฆ๋ฅผ ๋ง๋๋ฉด ํ ๋ฉด์ด ๋ฟ์๋ค๋ ๋ป์ด๋ฏ๋ก ํด๋น ์น์ฆ๋ฅผ +1 ์นด์ดํธํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ๋ถ ๊ณต๊ธฐ์ ๋ํด์๋ง ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ์ ํ์ ์์น ์์๋ฅผ ๋ฃ์ด์ฃผ๋๋ก ํด์ผ ํ๋ค.
๋ค์ ์ด๋ ์ง์ญ์ด ์น์ฆ๋ฉด ์นด์ดํธ๋ง ํด์ฃผ๊ณ ๋์ด๊ฐ๋ค.
๊ทธ ์ด์ ๋ ๋ฐ๊นฅ์ชฝ๋ถํฐ ์น์ฆ๋ฅผ ๋ น์ฌ์ผ ํ๊ณ , ๋ด๋ถ์ ๊ณต๊ธฐ๊ฐ ์๋ค๊ณ ํ๋๋ผ๋ ๋ด๋ถ ๊ณต๊ธฐ๋ก ์ธํด์๋ ๋ น์ง ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋ ์ด์ ๋ ์น์ฆ๊ฐ ์ธ๋ถ ๊ณต๊ธฐ์ ์ฌ๋ฌ ๋ฒ ๋ฟ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ ํ์ง ์๋๋ค.
์ด๋ ๊ฒ ํ ์ฌ์ดํด์ด ๋๋๋ฉด ์น์ฆ๋ฅผ ๋ น์ด๋ ์์ ์ ํด์ค์ผ ํ๋ค.
์น์ฆ๋ฅผ ๋ น์ด๋ ์์ ์ removeCheese ํจ์์์ graph์ ๋ํด ํ์ํ๋ฉด์ ์น์ฆ๋ฅผ ๋ น์ฌ์ค๋ค.
์น์ฆ๋ 1๋ก ์ด๊ธฐํ๋์ด์๊ธฐ ๋๋ฌธ์ ํด๋น ์์๊ฐ 3 ์ด์์ด๋ฉด ์น์ฆ๊ฐ ์ธ๋ถ ๊ณต๊ธฐ์ ๋ ๋ฒ ์ด์ ๋ฟ์๋ค๋ ๋ป์ด๋ค.
ํ์ง๋ง 2๋ผ๋ฉด ํ ๋ฉด๋ง ๋ฟ์๋ค๋ ๋ป์ด๋ฏ๋ก ๋ค์ BFS๋ฅผ ์ ๋๋ก ์ํํ๊ธฐ ์ํด 1๋ก ๋๋๋ ค์ค๋ค.
removeCheese ํจ์์์ ์น์ฆ๋ฅผ ๋ น์ด๋ ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด count + 1์ ํด์ฃผ๊ณ ๋ค์ ์ฒ์๋ถํฐ BFS๋ฅผ ์ํํด ์ฃผ๊ณ ,
์น์ฆ๋ฅผ ๋ น์ด๋ ์ํฉ์ด ์ผ์ด๋์ง ์์๋ค๋ฉด ๋ ์ด์ ๋ น์ผ ์น์ฆ๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก count๋ฅผ ์ถ๋ ฅํด ์ฃผ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๋ค.