Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

 

난이도 : 실버 2
태그 : 그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색

 

 

1. 설명

각각의 점을 정점으로 보고, 인접한 상하좌우의 정점이 서로 연결되어있다고 생각하여,

DFS, BFS로 모든 정점에서 탐색을 수행하며 블럭의 개수를 카운트 할 수 있습니다

DFS, BFS중 어느 것을 사용해도 무방하나, 저는 DFS를 사용해 풀이하였습니다.

 

2. 소스코드

<kotlin />
import java.io.BufferedReader import java.io.InputStreamReader val dx = arrayOf(0, 0, 1, -1) val dy = arrayOf(1, -1, 0, 0) lateinit var map: Array<Array<Int>> var n = 0 var m = 0 fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val T = br.readLine().toInt() repeat(T) { val mnk = br.readLine().split(" ") m = mnk[0].toInt() n = mnk[1].toInt() val k = mnk[2].toInt() var cnt = 0 // 맵 초기화 map = Array(n) { Array(m) { 0 } } repeat(k) { k -> val xy = br.readLine().split(" ") map[xy[1].toInt()][xy[0].toInt()] = 1 } // 모든 정점에서 dfs 실행 repeat(n) { x -> repeat(m) { y -> if(dfs(x,y)) cnt++ } } println(cnt) } } fun dfs(x: Int, y: Int): Boolean { if (map[x][y] == 0) return false map[x][y] = 0 for (i in 0 until 4) { val nx = x + dx[i] val ny = y + dy[i] if (nx !in 0 until n || ny !in 0 until m || map[nx][ny] == 0) continue dfs(nx, ny) } return true }

 

3. 후기

DFS, BFS를 사용한 블럭 개수 카운트의 기초격인 문제였습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.