1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
삼성 역량평가 IM 수준의 대표 문제입니다.
4방탐색과 DFS를 이용하는 (2차원 배열) 그래프 탐색문제입니다.
dfs에서 경계값 체크, 배추가 있는지, 방문 체크 3가지 조건만 넣어준다면 쉽게 풀 수 있습니다.
private static void dfs(int y, int x) {
visited[y][x] =true;
for(int k =0 ; k< dx.length; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if(nx<0 || ny <0 || nx>=M || ny>=N) continue; // 경계값 체크
if(!map[ny][nx]) continue; // 갈 수 있는 곳인지 (= 4방에 배추가 있는지)
if(visited[ny][nx]) continue; // 방문체크
dfs(ny, nx);
}
}
성능 요약
메모리: 13332 KB, 시간: 104 ms
분류
그래프 이론(graphs), 그래프 탐색(graph_traversal), 너비 우선 탐색(bfs), 깊이 우선 탐색(dfs)
전체코드(자바)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int M, N, count, sum;
static boolean[][] map;
static boolean[][] visited;
static int[] dx = {1, -1, 0, 0}; // 동 서 남 북
static int[] dy = {0, 0 , -1, 1};
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc =0; tc<T; tc++ ) {
// 맵 초기화
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
count = Integer.parseInt(st.nextToken()); // 배수 총합
map = new boolean[N][M];
visited = new boolean[N][M];
sum = 0;
// 배추 입력
for(int i =0; i < count; i++) {
st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken()); // 가로
int col = Integer.parseInt(st.nextToken()); // 세로
map[col][row] = true;
}
// 모든 지점마다 dfs
for(int i = 0; i< N; i++) {
for(int j =0; j <M; j++) {
// 배추있는데 아직 방문 안했으면
if(!visited[i][j] && map[i][j]) {
//System.out.println(" i :" + i + " j :" + j +" sum :" + sum);
sum++;
dfs(i,j);
}
}
}
System.out.println(sum);
} // tc 종료
}
private static void dfs(int y, int x) {
//System.out.println("y :" + y + " x : " +x);
visited[y][x] =true;
for(int k =0 ; k< dx.length; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if(nx<0 || ny <0 || nx>=M || ny>=N) continue; // 경계값 체크
if(!map[ny][nx]) continue; // 갈 수 있는 곳인지 (= 4방에 배추가 있는지)
if(visited[ny][nx]) continue; // 방문체크
dfs(ny, nx);
}
}
}
'알고리즘 > DFS' 카테고리의 다른 글
[ALGO#13] 백준 11724_실버2_연결 요소의 개수 : DFS [JAVA] (0) | 2023.01.23 |
---|---|
[ALGO#8] 백준_15900_실버1_나무 탈출 : DFS [JAVA] (0) | 2023.01.19 |
[ALGO#6] 백준_1463_실버3_1로 만들기 : DFS [JAVA] (0) | 2023.01.17 |
[ALGO#4] 백준_2606_실버3_바이러스 : DFS [JAVA] (0) | 2023.01.17 |
[ALGO#3] 백준_1303_실버1_전쟁-전투 : DFS와 BFS [JAVA] (2) | 2023.01.15 |