[JavaScript/node.js] ๋ฐฑ์ค 24513๋ฒ - ์ข๋น ๋ฐ์ด๋ฌ์ค
[๋ฌธ์ ]
https://www.acmicpc.net/problem/24513
[ํ์ด]
BFS๋ฅผ ํตํด ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆฝ๋๋ค.
์ด๊ธฐ ์ธํ
- village : ๋ง์ ์ ๋ณด ์ ์ฅ
- virus: [x์ขํ, y์ขํ, ๋ฐ์ด๋ฌ์ค ํ์ ] ํํ๋ก ๋ฐ์ด๋ฌ์ค ์ ๋ณด ์ ์ฅ
- checkOut(x, y) : ๋ง์์ ๋ฒ์ด๋ ์์น๋ฉด true, ๋ง์ ์์ ์๋ค๋ฉด false๋ฅผ ๋ฐํ
ํ์ด ๊ณผ์
bfs๋ฅผ ํตํด ๊ฐฑ์ ๋๋ ๋ฐ์ด๋ฌ์ค ์ ๋ณด๋ฅผ virus์ ์ ์ฅํ๋ฉฐ ๋ชจ๋ ๊ฒ์ฌํฉ๋๋ค.
์ด๋ ์ฃผ์ํ ์ ์ ๋์๊ฐ๋์ 1๋ฒ ๋ฐ์ด๋ฌ์ค์ 2๋ฒ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ง๋๋ฉด 3๋ฒ ๋ฐ์ด๋ฌ์ค๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์ด์ ๋ฐ์ด๋ฌ์ค ํ์ ์์ +2์ฉ ์ซ์๋ฅผ ๋ํด์ฃผ์ด ์๊ฐ์ ๊ตฌ๋ถํ์์ต๋๋ค.
- ์ฒซ๋ฒ์งธ ์๊ฐ์ ํผ์ง ๋ฐ์ด๋ฌ์ค : 1, 2
- ๋๋ฒ์งธ ์๊ฐ์ ํผ์ง ๋ฐ์ด๋ฌ์ค : 3, 4
- ์ธ๋ฒ์งธ ์๊ฐ์ ํผ์ง ๋ฐ์ด๋ฌ์ค : 5, 6
(ํธ์์ฑ์ ์ํด 3๋ฒ ๋ฐ์ด๋ฌ์ค๋ก ๋ฒ์ง ๋ง์์ Infinity๋ฅผ ์ ์ฅํ์ฌ ๊ตฌ๋ถ)
bfs์ ๋์๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋ง์ฝ village๊ฐ -1์ด๋ Infinity๋ผ๋ฉด ๋์ด์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์์ผ๋ฏ๋ก continueํฉ๋๋ค.
2. ์ํ์ข์ฐ ๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
- village๊ฐ 0์ด๋ฉด ์์ง ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง์ง ์์์ผ๋ฏ๋ก ์ด์ ๋ฐ์ด๋ฌ์ค์ type + 2๋ฅผ ์ ์ฅํ virus์ ํด๋น ์ ๋ณด๋ฅผ push
- village์ ์๋ก ๋ค์ด์จ ๋ฐ์ด๋ฌ์ค์ type์ด ๋ค๋ฅธ ๊ฒฝ์ฐ(์ง, ํ ์์ผ๋) ์๋ง ๋ฐ์ด๋ฌ์ค 3์ด ๋ ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
- village๊ฐ ํ์๋ฉด (village์ ์ซ์ - 1) === (type + 2) ์ธ ๊ฒฝ์ฐ์ ๋ฐ์ด๋ฌ์ค 3์ผ๋ก ๊ฐฑ์
- village๊ฐ ์ง์๋ฉด (village์ ์ซ์ + 1) === (type + 2) ์ธ ๊ฒฝ์ฐ์ ๋ฐ์ด๋ฌ์ค 3์ผ๋ก ๊ฐฑ์
๋ง์ง๋ง์ผ๋ก ๋ง์ ์ ๋ณด๋ฅผ ๋ชจ๋ ํ์ํ๋ฉฐ ๋ฐ์ด๋ฌ์ค 1, 2, 3์ ๊ฐ์๋ฅผ ๋ํฉ๋๋ค.
- -1์ด๋ 0์ด๋ฉด ๋ฐ์ด๋ฌ์ค๊ฐ ์์
- ํ์๋ฉด 1๋ฒ ๋ฐ์ด๋ฌ์ค
- ์ง์๋ฉด 2๋ฒ ๋ฐ์ด๋ฌ์ค
- Infinity๋ฉด 3๋ฒ ๋ฐ์ด๋ฌ์ค
[์ฝ๋]
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(filePath).toString().split('\n');
const [N, M] = input[0].split(" ").map(Number);
// ๋ง์ ์ ๋ณด
const village = [];
// ๋ฐ์ด๋ฌ์ค ์์น
let virus = [];
for (let i = 1; i <= N; i++) {
village.push(input[i].split(" ").map(Number));
for (let j = 0; j < M; j++) {
if (village[i - 1][j] === 1 || village[i - 1][j] === 2) {
// x, y, type
virus.push([i - 1, j, village[i - 1][j]]);
}
}
}
const checkOut = (x, y) => {
if (x < 0 || y < 0 || x >= N || y >= M) {
return true;
}
return false;
}
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
let idx = 0;
let time = 2;
// ๋์๊ฐ๋๋ฅผ ํ์ธํด์ผํจ!!
// ๋ฐ์ด๋ฌ์ค๊ฐ ๋ชจ๋ ํผ์ง
while (idx < virus.length) {
const [x, y, type] = virus[idx];
idx++;
if(village[x][y] === -1 || village[x][y] === Infinity) {
continue;
}
for (let i = 0; i < 4; i++) {
const [nx, ny] = [x + dx[i], y + dy[i]];
if (checkOut(nx, ny) || village[nx][ny] === -1 || village[nx][ny] === Infinity) {
continue;
}
if(village[nx][ny] === 0) {
// ์ฒซ ๋ฐฉ๋ฌธ
village[nx][ny] = type + 2;
virus.push([nx, ny, type + 2]);
} else {
// ๋์๊ฐ๋ ๋ค๋ฅธ ๋ฐ์ด๋ฌ์ค ๋ฐฉ๋ฌธ
if(type%2 !== village[nx][ny]%2) {
// ๋ฐ์ด๋ฌ์ค 1์ด ๋ค์ด์ด
if(type%2 === 1 && village[nx][ny] - 1 === type + 2) {
village[nx][ny] = Infinity;
} else if(type%2 === 0 && village[nx][ny] + 1 === type + 2) {
village[nx][ny] = Infinity;
}
}
}
}
}
let one = 0;
let two = 0;
let three = 0;
for(let i=0;i<N;i++) {
for(let j=0;j<M;j++) {
if(village[i][j] === -1 || village[i][j] === 0) {
continue;
}
if(village[i][j] %2 === 1) one++;
else if(village[i][j] % 2 === 0) two++;
else if(village[i][j] === Infinity) three++;
}
}
console.log(one, two, three);