[๋ฐฑ์ค]2468๋ฒ '์์ ์์ญ' ๋ฌธ์ ํ์ด - JavaScript
๋ฌธ์ ๐
https://www.acmicpc.net/problem/2468
ํ์ด ์๊ณ ๋ฆฌ์ฆ: DFS
๋์ด๋: ์ค๋ฒ 1
์ ๊ทผ ๋ฐฉ๋ฒ โ
๋๋ DFS๋ก ๋ฌธ์ ๋ฅผ ํ์ดํ๋ค.
๋ฌธ์ ๊ฐ ์๊ตฌํ๋ ๊ฒ์ ์กฐ๊ฑด์ ๋ง๋ ์ฐ๊ฒฐ ์์๊ฐ ๋ช ๊ฐ์ธ์ง ์ฐพ๋ ๊ฒ์ด๋ค.
๋น๋ฌผ์ ์ ๊ธฐ์ง ์๋ ๋์ด์ ์ฐ๊ฒฐ์์๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ๋น๊ฐ ๋ด๋ ธ์ ๋ ์์ด๋ ๋์ด๋ณด๋ค ๋์ ์์๋ค์ ์ฐพ์์ฃผ๋ฉด ๋๋ค.
์ฃผ์ ์ฌํญ์ผ๋ก "์๋ฌด ์ง์ญ๋ ๋ฌผ์ ์ ๊ธฐ์ง ์์ ์๋ ์๋ค."๋ผ๋ ๋ง์ด ์๊ธฐ ๋๋ฌธ์ ๋น๊ฐ ์ ๋ด๋ ค์ ๋ชจ๋ ์ ์ ๊ธฐ๋ ์ํฉ๋ ์์ ์ ์๋ค.
ํ์ด ์ฝ๋ ๐ก
const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');
const [n, ...arr] = input;
const graph = arr.map((item) => item.split(' ').map(Number));
const dx = [0, 0, 1, -1];
const dy = [1, -1, 0, 0];
let maxHeight = 0;
for (const x of graph) {
maxHeight = Math.max(maxHeight, ...x);
}
function dfs(graph, x, y, target) {
if (x < 0 || x >= n || y < 0 || y >= n) {
return false;
}
if (graph[x][y] <= target) {
return false;
}
graph[x][y] = 0;
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
dfs(graph, nx, ny, target);
}
return true;
}
let answer = 0;
let count = 0;
while (maxHeight > -1) {
const newGraph = graph.map((item) => [...item]);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (dfs(newGraph, i, j, maxHeight)) {
count++;
}
}
}
answer = Math.max(answer, count);
count = 0;
maxHeight--;
}
console.log(answer);
ํ์ด ํด์ค ๐ก
๋น๋ฌผ์ด ์์ฌ์ ์ ๊ธธ ์ ์๋ ์ต๋์ ๋์ด๋ ์ง์ญ ์ค ์ต๋์ ๋์ด๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ ์ด์์ผ๋ก๋ ๊ณ์ฐํด๋ ์ต๋ ๋์ด์ ๊ฐ์ผ๋ก ๊ณ์ฐํ์ ๋์ ๊ฐ์ด ๋์ค๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ maxHeight์ ๊ตฌํด์ฃผ๊ณ maxHeight๊น์ง๋ง ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๊ฒ ๋ ํด์คฌ๋ค.
while๋ฌธ์์๋ ์ต๋ ๋์ด๋ถํฐ 0๊น์ง ๋ฐ๋ณต์ด ๋ ์ ์๋๋ก ํด์คฌ๋ค.
์ต๋ ๋์ด๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค graph๋ฅผ ์ด๊ธฐ ์ํ์์ ๊ฒ์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ์ํ๋ก ๋๋ ค์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ ์๋จ๋ถํฐ ์์ฐจ์ ์ผ๋ก ๊ฒ์ฌํ ์ ์๋๋ก ์ด์ค๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๊ณ dfsํจ์๋ฅผ ํธ์ถํ๋ค.
dfsํจ์๋ ์ด๊ธฐํํ graph์ ํ(i), ์ด(j), ๋น๊ตํด์ ๊ฒ์ฌํ ์ต๋ ๋์ด๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ true๊ฐ ์ฆ ์ต๋ ๋์ด๋ณด๋ค ๋์ ์ง์ญ์ ์,ํ,์ข,์ฐ ๊ฐ ์ ์๋ ๋ฐฉํฅ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ๋ฉด์ ์ํํด์ ์ ๋์์๋ค๋ฉด count๋ฅผ ํด์ค๋ค.
์ต์ข ์ ์ผ๋ก ์ต๋ํ ๋ฌผ์ด ์ ์ ๊ธฐ๋ ์ง์ญ์ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ answer์ count ๋ณ์๋ฅผ ๋น๊ตํด์ ๋์ด๋ง๋ค ๊ณ์ฐํ ์ต๋ ์ง์ญ์ answer์ ๋ด์์ฃผ๊ณ ๋ค์ ๋์ด์ ๋ํ count๋ฅผ ์ํด count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
dfsํจ์์์๋ ๊ทธ๋ํ์ ์์ญ์์ ๋ฒ์ด๋๊ฑฐ๋, ์ฌ๊ท๋ฅผ ๋๋ graph์ ์์๊ฐ ๋น๊ตํ๊ณ ์ ํ๋ ๋์ด๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด false๋ฅผ return ํด์คฌ๋ค.
์ฆ ๋น๊ตํ๊ณ ์ ํ๋ ๋์ด(target) ๋ณด๋ค ๋์ ์์๋ง ํต๊ณผ(๊ฒ์ฌ)ํ ์ ์๋๋ก ํด์คฌ๋ค.
์ ์กฐ๊ฑด๋ค์ด ํต๊ณผ๊ฐ ๋๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ก 0์ ๋ง๋ค์ด์ฃผ๊ณ ์, ํ, ์ข, ์ฐ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ์ฌ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์คฌ๋ค.