๐ก ์ ๊ทผ๋ฒ
- ํ์๋ฅผ ๊ณ์ฐํ๋ค
1-1. ๋งค๋ ๋น์ฐ์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค iceCnt
1-2. ๋น์ฐ์ ๋์ด๋ฅผ ๋ฐ๊ฟ์ค ๋๋ง๋ค ๋น์ฐ์ ๊ฐ์ -1 ํด์ฃผ๊ณ (iceCnt--)
1-3. ๋ฐ๊ฟ์ผ ํ ๋น์ฐ์ด ๋จ์ง ์์์ ๋, ์๋ก์ด ํด๊ฐ ์์๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค(year++) - ๋ชจ๋ ๋น์ฐ์ด ๋
น์ ๋๊น์ง ๋น์ฐ์ ๋์ด๋ฅผ ์กฐ์ ํ๋ค.(bfs์ฌ์ฉ)
2-1. ๋น์ฐ์ ๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ 2๊ฐ๋ฅผ ์ฌ์ฉํ๋ค.
(why? ๋ฐฐ์ด์ 1๊ฐ๋ง ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ ํด์ค ๊ฒฝ์ฐ, ๊ฐ์ ํด์ ๋ น์์ 0์ด ๋ ๋น์ฐ์ด ์ธ์ ๋น์ฐ์ ๋์ด๋ฅผ ์กฐ์ ํ ๋ ๋ฐ๋ค๋ก ์นด์ดํธ ๋๊ธฐ ๋๋ฌธ์)
2-2. ์ค๋ฆฌ์ง๋ ๋ฐฐ์ด(=์ํด๊ฐ ์์๋๊ณ ์์ง ๋น์ฐ์ด ๋ น์ง ์์ ๋ฐฐ์ด)๊ธฐ์ค์ผ๋ก ์ธ์ ๋ฐ๋ค๋ฅผ ํ์ํ๋ฉด์ ์์ ๋ฐฐ์ด์ ๋ณํ ๋น์ฐ์ ๋์ด๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋ค(bfs์ฌ์ฉ)
2-3. ๋์ด๊ฐ 0๋ณด๋ค ํฌ๋ฉด ๋ค์ ํ์ ๋ฃ์ด์ค๋ค
2-4. ๋ฐ๊ฟ์ผ ํ ๋น์ฐ์ด ๋จ์ง ์์์ ๋, ์ค๋ฆฌ์ง๋ ๋ฐฐ์ด์ ์์ ๋ฐฐ์ด์ ๊ฐ์ ๋ณต์ฌํด์ค๋ค - ๋น์ฐ์ด 2๊ฐ๋ก ๋๋์๋์ง ํ์ธํ๋ค. (dfs ์ฌ์ฉ)
3-1. ๋น์ฐ์ ๋์ด๋ฅผ ๋ชจ๋ ๋ฐ๊พธ๊ณ ์๊ฐ(๋ )์ +1 ํด์ฃผ๊ธฐ ์ ์ ๋น์ฐ์ด 2 ๋ฉ์ด๋ฆฌ๋ก ๋๋์๋์ง ํ์ธํ๋ค.
3-2. checkํจ์์ ์ธ์๋ก๋ ํ์ ๋ค์ด๊ฐ์๋ ์ฒซ ๋ฒ์งธ ๋น์ฐ์ [row index,column index]์ ๋จ์์๋ ๋น์ฐ(ํ์ ๋ค์ด๊ฐ ์๋ ๋น์ฐ)์ ๊ฐ์๋ฅผ ์ ๋ฌํ๋ค.
3-3. dfs๋ฅผ ์ฌ์ฉํด์ ํด๋น ์์์์๋ถํฐ ํ ๋ฉ์ด๋ฆฌ๋ฅผ ์ด๋ฃจ๋ ์์๋ค์ ๊ฐ์(cnt)๋ฅผ ๊ตฌํ๋ค
3-4. ํ์ ๋ค์ด์๋ ๊ฐ๊ณผ cnt์ ๊ฐ์ด ๊ฐ์ง ์์ผ๋ฉด 2๋ฉ์ด๋ฆฌ๋ก ๋ถ๋ฆฌ๋ ๊ฒ์์ผ๋ก year๋ฅผ ๋ฆฌํดํด์ค๋ค.
ํ๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ง์ ๊ตฌํํฉ๋๋ค
class Node {
constructor(val) {
this.val = val;
this.next = null;
}
}
class Queue {
constructor() {
this.front = null;
this.rear = null;
this.size = 0;
}
enqueue(val) {
const node = new Node(val);
if (!this.front) {
this.front = node;
this.rear = node;
} else {
this.rear.next = node;
this.rear = node;
}
return ++this.size;
}
dequeue() {
if (!this.front) return null;
const tmp = this.front;
if (this.front === this.rear) {
this.rear = null;
}
this.front = this.front.next;
this.size--;
return tmp.val;
}
}
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
// ์
๋ ฅ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์ค์๋ ์
๋ ฅ ๊ฐ์ ๊ธธ์ด(n), n๊ฐ์ ์ค์ ๊ฑธ์ณ์ ํ ์ค์ ํ๋์ ์
๋ ฅ๊ฐ์ด ์ฃผ์ด์ง ๋
const [n, ...input] = require('fs')
.readFileSync(filePath)
.toString()
.trim()
.split('\n');
/**
* ์ ๊ทผ๋ฒ
* 1. ํ์๋ฅผ ๊ณ์ฐํ๋ค
* 1-1. ๋งค๋
๋น์ฐ์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค iceCnt
* 1-2. ๋น์ฐ์ ๋์ด๋ฅผ ๋ฐ๊ฟ์ค ๋๋ง๋ค ๋น์ฐ์ ๊ฐ์ -1 ํด์ฃผ๊ณ (iceCnt--)
* 1-3. ๋ฐ๊ฟ์ผ ํ ๋น์ฐ์ด ๋จ์ง ์์์ ๋, ์๋ก์ด ํด๊ฐ ์์๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค(year++)
*
* 2. ๋ชจ๋ ๋น์ฐ์ด ๋
น์ ๋๊น์ง ๋น์ฐ์ ๋์ด๋ฅผ ์กฐ์ ํ๋ค.(bfs์ฌ์ฉ)
* 2-1. ๋น์ฐ์ ๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ 2๊ฐ๋ฅผ ์ฌ์ฉํ๋ค
* * ๋ฐฐ์ด์ 1๊ฐ๋ง ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ ํด์ค ๊ฒฝ์ฐ, ๊ฐ์ ํด์ ๋
น์์ 0์ด ๋ ๋น์ฐ์ด ์ธ์ ๋น์ฐ์ ๋์ด๋ฅผ ์กฐ์ ํ ๋ ๋ฐ๋ค๋ก ์นด์ดํธ ๋๊ธฐ ๋๋ฌธ์
* 2-2. ์ค๋ฆฌ์ง๋ ๋ฐฐ์ด(=์ํด๊ฐ ์์๋๊ณ ์์ง ๋น์ฐ์ด ๋
น์ง ์์ ๋ฐฐ์ด)๊ธฐ์ค์ผ๋ก ์ธ์ ๋ฐ๋ค๋ฅผ ํ์ํ๋ฉด์ ์์ ๋ฐฐ์ด์ ๋ณํ ๋น์ฐ์ ๋์ด๋ฅผ ์
๋ฐ์ดํธ ํด์ค๋ค(bfs์ฌ์ฉ)
* 2-3. ๋์ด๊ฐ 0๋ณด๋ค ํฌ๋ฉด ๋ค์ ํ์ ๋ฃ์ด์ค๋ค
* 2-4. ๋ฐ๊ฟ์ผ ํ ๋น์ฐ์ด ๋จ์ง ์์์ ๋, ์ค๋ฆฌ์ง๋ ๋ฐฐ์ด์ ์์ ๋ฐฐ์ด์ ๊ฐ์ ๋ณต์ฌํด์ค๋ค
*
* 3. ๋น์ฐ์ด 2๊ฐ๋ก ๋๋์๋์ง ํ์ธํ๋ค.
* 3-1. ๋น์ฐ์ ๋์ด๋ฅผ ๋ชจ๋ ๋ฐ๊พธ๊ณ ์๊ฐ(๋
)์ +1 ํด์ฃผ๊ธฐ ์ ์ ๋น์ฐ์ด 2 ๋ฉ์ด๋ฆฌ๋ก ๋๋์๋์ง ํ์ธํ๋ค.
* 3-2. checkํจ์์ ์ธ์๋ก๋ ํ์ ๋ค์ด๊ฐ์๋ ์ฒซ ๋ฒ์งธ ๋น์ฐ์ [row index,column index]์ ๋จ์์๋ ๋น์ฐ(ํ์ ๋ค์ด๊ฐ ์๋ ๋น์ฐ)์ ๊ฐ์๋ฅผ ์ ๋ฌํ๋ค.
* 3-3. dfs๋ฅผ ์ฌ์ฉํด์ ํด๋น ์์์์๋ถํฐ ํ ๋ฉ์ด๋ฆฌ๋ฅผ ์ด๋ฃจ๋ ์์๋ค์ ๊ฐ์(cnt)๋ฅผ ๊ตฌํ๋ค
* 3-4. ํ์ ๋ค์ด์๋ ๊ฐ๊ณผ cnt์ ๊ฐ์ด ๊ฐ์ง ์์ผ๋ฉด 2๋ฉ์ด๋ฆฌ๋ก ๋ถ๋ฆฌ๋ ๊ฒ์์ผ๋ก year๋ฅผ ๋ฆฌํดํด์ค๋ค
*/
function solution(N, M, Map) {
const ice = new Queue();
//๋น์ฐ์ ๊ฐ์
let iceCnt;
//์๊ฐ
let year = 1;
const dr = [1, -1, 0, 0];
const dc = [0, 0, 1, -1];
//์์ ๋ฐฐ์ด
const tmpMap = [...Map.map((r) => [...r])];
//์ง๋๋ฅผ ๋๋ฉด์ ๋น์ฐ์ด ์๋ ๋ถ๋ถ์ ์ธ๋ฑ์ค๋ฅผ ํ์ ๋ฃ์ด์ค๋ค
Map.forEach((r, rIdx) => {
r.forEach((c, cIdx) => {
if (c !== 0) {
ice.enqueue([rIdx, cIdx]);
}
});
});
//๋นํ์ ๊ฐ์๋ฅผ ์
๋ฐ์ดํธ ํด์ค๋ค
iceCnt = ice.size;
//๋นํ๊ฐ ๋ค ๋
น์ ๋๊น์ง ๋ฐ๋ณตํ๋ค
while (ice.size) {
//๋ชจ๋ ๋นํ์ ๋์ด๋ฅผ ์กฐ์ ํ์ ๋
if (iceCnt === 0) {
//์ค๋ฆฌ์ง๋ ๋ฐฐ์ด์ ์์๋ฐฐ์ด์ ๊ฐ์ ๋ณต์ฌํด์ค๋ค
Map = [...tmpMap.map((r) => [...r])];
//2๋ฉ์ด๋ฆฌ๋ก ๋๋์๋์ง ํ์ธํ๋ค
const [r, c] = ice.front.val;
if (check(r, c, ice.size)) return year;
year++;
iceCnt = ice.size;
}
const [r, c] = ice.dequeue();
//์ธ์ ๋ฐ๋ค ๊ฐ์
let sea = 0;
for (let i = 0; i < 4; i++) {
const nextR = r + dr[i];
const nextC = c + dc[i];
if (
nextR >= 0 &&
nextR < N &&
nextC >= 0 &&
nextC < M &&
!Map[nextR][nextC]
) {
sea++;
}
}
//์กฐ์ ํ ๋น์ฐ์ ๋์ด๊ฐ 0๋ณด๋ค ํฌ๋ฉด ํ์ ๋ค์ ๋ฃ์ด์ค๋ค
if (Map[r][c] - sea > 0) {
ice.enqueue([r, c]);
tmpMap[r][c] -= sea;
} else {
tmpMap[r][c] = 0;
}
//๋์ด ์กฐ์ ํด์ผ ํ๋ ๋น์ฐ์ ๊ฐ์ -1
iceCnt--;
}
function check(r, c, size) {
const visited = Array.from(new Array(N), () => new Array(M).fill(false));
let cnt = 0;
cnt++;
visited[r][c] = true;
dfs(r, c);
function dfs(r, c) {
for (let i = 0; i < 4; i++) {
const nextR = r + dr[i];
const nextC = c + dc[i];
if (
nextR >= 0 &&
nextR < N &&
nextC >= 0 &&
nextC < M &&
Map[nextR][nextC] &&
!visited[nextR][nextC]
) {
cnt++;
visited[nextR][nextC] = true;
dfs(nextR, nextC);
}
}
}
return cnt !== size;
}
return 0;
}
const arr = n.split(' ').map(Number);
const answer = solution(
arr[0],
arr[1],
input.map((r) => r.split(' ').map(Number)),
);
console.log(answer);
'๐ง ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค][PCCP ๊ธฐ์ถ๋ฌธ์ ] 3๋ฒ / ์๋ ๋ก๊ทธ ์๊ณ JSํ์ด (0) | 2023.12.29 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค][PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ์์ ์์ถ JSํ์ด (0) | 2023.12.29 |
[๋ฐฑ์ค] 7569 ํ ๋งํ js ํ์ด (1) | 2023.12.28 |
[๋ฐฑ์ค] 4179 ๋ถ! js ํ์ด (1) | 2023.12.27 |
๋ฐฑ์ค JS ์ ๋ ฅ๊ฐ ํ ํ๋ฆฟ(VSCode ์ค๋ํซ์ผ๋ก ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ) (0) | 2023.12.27 |