
๋์ด๋: ๊ณจ๋ 4
ํ์ด ์๊ณ ๋ฆฌ์ฆ: BFS
1. ๋ฌธ์
NรNํฌ๊ธฐ์ ๋
์ด ์๊ณ , ๋
์ 1ร1๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ๋
์๋ ๋๋ผ๊ฐ ํ๋์ฉ ์กด์ฌํ๋ฉฐ, rํ c์ด์ ์๋ ๋๋ผ์๋ A[r][c]๋ช
์ด ์ด๊ณ ์๋ค. ์ธ์ ํ ๋๋ผ ์ฌ์ด์๋ ๊ตญ๊ฒฝ์ ์ด ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ผ๋ 1ร1 ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ ์ฌ๊ฐํ ํํ์ด๋ค.
์ค๋๋ถํฐ ์ธ๊ตฌ ์ด๋์ด ์์๋๋ ๋ ์ด๋ค.
์ธ๊ตฌ ์ด๋์ ํ๋ฃจ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๊ณ , ๋ ์ด์ ์๋ ๋ฐฉ๋ฒ์ ์ํด ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์๋๋ค.
- ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ L๋ช ์ด์, R๋ช ์ดํ๋ผ๋ฉด, ๋ ๋๋ผ๊ฐ ๊ณต์ ํ๋ ๊ตญ๊ฒฝ์ ์ ์ค๋ ํ๋ฃจ ๋์ ์ฐ๋ค.
- ์์ ์กฐ๊ฑด์ ์ํด ์ด์ด์ผํ๋ ๊ตญ๊ฒฝ์ ์ด ๋ชจ๋ ์ด๋ ธ๋ค๋ฉด, ์ธ๊ตฌ ์ด๋์ ์์ํ๋ค.
- ๊ตญ๊ฒฝ์ ์ด ์ด๋ ค์์ด ์ธ์ ํ ์นธ๋ง์ ์ด์ฉํด ์ด๋ํ ์ ์์ผ๋ฉด, ๊ทธ ๋๋ผ๋ฅผ ์ค๋ ํ๋ฃจ ๋์์ ์ฐํฉ์ด๋ผ๊ณ ํ๋ค.
- ์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์นธ์ ์ธ๊ตฌ์๋ (์ฐํฉ์ ์ธ๊ตฌ์) / (์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ์นธ์ ๊ฐ์)๊ฐ ๋๋ค. ํธ์์ ์์์ ์ ๋ฒ๋ฆฐ๋ค.
- ์ฐํฉ์ ํด์ฒดํ๊ณ , ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
1.1. ์ ๋ ฅ
์ฒซ์งธ ์ค์ N, L, R์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 50, 1 โค L โค R โค 100)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค. rํ c์ด์ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c]์ ๊ฐ์ด๋ค. (0 โค A[r][c] โค 100)
์ธ๊ตฌ ์ด๋์ด ๋ฐ์ํ๋ ์ผ์๊ฐ 2,000๋ฒ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์
๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
1.2. ์ถ๋ ฅ
์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
1.3. ์์ ์ ๋ ฅ 1
2 20 50
50 30
20 40
1.4. ์์ ์ถ๋ ฅ 1
1

2. ํ์ด ์ฝ๋ ๐ก
<javascript />
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, l, r] = input[0].split(' ').map(Number);
const maps = input.slice(1).map((row) => row.split(' ').map(Number));
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
let totalCount = 0;
const bfs = (x, y, visited) => {
const united = [[x, y]];
visited[x][y] = true;
let sum = maps[x][y];
const queue = new Queue();
queue.enqueue([x, y]);
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 >= n) continue;
if (visited[nx][ny]) continue;
const diff = Math.abs(maps[x][y] - maps[nx][ny]);
if (diff >= l && diff <= r) {
visited[nx][ny] = true;
queue.enqueue([nx, ny]);
sum += maps[nx][ny];
united.push([nx, ny]);
}
}
}
const avg = Math.floor(sum / united.length);
for (const unit of united) {
const [i, j] = unit;
maps[i][j] = avg;
}
};
while (true) {
const visited = Array.from({ length: n }, () => Array(n).fill(false));
let count = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (!visited[i][j]) {
bfs(i, j, visited);
count++;
}
}
}
if (count === n * n) break;
totalCount++;
}
console.log(totalCount);
3. ํ์ด ํด์ค ๐ก
๋ ์ด์ ์ด๋์ด ํ์ ์์ ๋๊น์ง BFS ํจ์๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋์ BFS ํจ์๋ฅผ ํธ์ถํ๊ณ count๋ฅผ ํด์ฃผ๋ฉด์ ๋งต์ ์ ์ฒด ํฌ๊ธฐ๋งํผ ๋ฐ๋ณต์ ํด์ค๋ค.
BFS ํจ์์์๋ ์์์ ๋ํ ์, ํ, ์ข, ์ฐ๋ก ํ์์ ํ๋ค.
ํ์์ด ๊ฐ๋ฅํ ๋ฒ์์ ํ์ฌ ์์์ ๋ค์ ์์์ ๊ฐ์ ์ฐจ์ด๊ฐ l ์ด์ r ์ดํ๋ฉด ๊ณ์ฐ์ ๋ค์ด๊ฐ๋ค.
ํ๋ฒ ๋ฐฉ๋ฌธ ํ๋ ๊ณณ์ ๋ค์ ๋ฐฉ๋ฌธํด์ ๊ณ์ฐ๋์ง ์๋๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ,
ํ์ ๋ฃ์ด์ฃผ๋ฉด์ sum์ ์ด๋์ด ํ์ํ ์ง์ญ์ ์ธ๊ตฌ์๋ฅผ ๋ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋์ด ํ์ํ ์ง์ญ์ ์ธ๊ตฌ ์์ ์ขํ๋ฅผ united ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
ํ๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต์ด ๋๋๋ฉด united ๋ฐฐ์ด์ ๋ฐ๋ณต๋ฌธ์ ์คํํ๋๋ฐ maps์ ํด๋น ์ขํ์ ๊ฐ์ ํ๊ท ๊ฐ์ผ๋ก ๋ณํํด ์ค๋ค.