알고리즘
[백준] 유기농 배추 (1012)
2 views
문제 설명
백준 유기농 배추 문제 풀이(https://www.acmicpc.net/problem/1012)

문제 개요
문제는 인접된 배추 그룹을 세면 되는 문제이다.
코드 구현
text
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 함수 반환값의 합을 구하면 된다.
요약 및 참고사항
- 문제는 DFS를 사용하여 인접한 배추 그룹을 탐색하는 방식으로 해결할 수 있습니다.
visited배열을 활용해 이미 탐색한 배추를 재방문하지 않도록 처리합니다.- 입력 데이터를 체계적으로 분리하고, DFS를 효율적으로 구현하는 것이 핵심입니다.
