알고리즘
[백준] 유기농 배추 (1012)
9 views
블로그 불러오는 중...
알고리즘

문제는 인접된 배추 그룹을 세면 되는 문제이다.
const input =
process.platform === "linux"
? require("fs").readFileSync("/dev/stdin").toString().trim().split("\n")
: require("fs")
.readFileSync("./input.txt")
.toString()
.trim()
.split(process.platform === "darwin" ? "\n" : "\r\n");
const caseCount = Number(input[0]);
const getTestCaseInfo = () => {
let currentIndex = 1;
const cases = [];
for (let i = 0; i < caseCount; i++) {
const [horizontal, vertical, count] = input[currentIndex]
.split(" ")
.map(Number);
const positions = input
.slice(currentIndex + 1, currentIndex + 1 + count)
.map((line) => line.split(" ").map(Number));
currentIndex += count + 1;
cases.push({ horizontal, vertical, positions });
}
return cases;
};
const createGrid = (rows, cols, initialValue) =>
Array.from({ length: rows }, () => Array(cols).fill(initialValue));
const isValid = (x, y, xMax, yMax, visited, map) =>
x >= 0 && y >= 0 && x < xMax && y < yMax && !visited[x][y] && map[x][y];
const dfs = (x, y, xMax, yMax, visited, map) => {
if (!isValid(x, y, xMax, yMax, visited, map)) return 0;
visited[x][y] = true;
const directions = [
[-1, 0],
[1, 0],
[0, -1],
[0, 1],
];
for (const [dx, dy] of directions) {
dfs(x + dx, y + dy, xMax, yMax, visited, map);
}
return 1;
};
const answer = (cases) => {
cases.forEach(({ horizontal, vertical, positions }) => {
const map = createGrid(horizontal, vertical, 0);
const visited = createGrid(horizontal, vertical, false);
let count = 0;
positions.forEach(([x, y]) => {
map[x][y] = 1;
});
for (let x = 0; x < horizontal; x++) {
for (let y = 0; y < vertical; y++) {
count += dfs(x, y, horizontal, vertical, visited, map);
}
}
console.log(count);
});
};
const data = getTestCaseInfo();
answer(data);getTestCaseInfo() 함수를 통해 맨 처음에 테스트케이스를 분리했다. 테스트 케이스의 첫번째는 가로,세로, 배추의 개수 이고 나머지는 배추가 심어진 위치를 가진 배열이다.
해당 함수를 통해 테스트 케이스의 정보를 받고, 배추를 탐색한다.
dfs 함수는 각 배추가 속한 그룹을 탐색한다. 방문한 곳에는 체크를 해서 이미 방문 한 경우엔 방문하지 않게 했다. 이미 방문한 경우는 그룹으로 이미 카운팅 된 경우이기 때문이다.
해당 함수는 재귀적으로 상하좌우를 확인하며 새로운 그룹이 발견되면 1을 반환하고, 새로운 그룹이 아닐 경우엔 0을 반환한다.
모든 경우를 순회 하면서, 해당 dfs 함수 반환값의 합을 구하면 된다.
visited 배열을 활용해 이미 탐색한 배추를 재방문하지 않도록 처리합니다.