Notice
Recent Posts
Link
- Today
- Total
hye-log
[백준]1012번 유기농 배추(JAVA) 본문
0. 문제 링크
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
1. 문제 설명
1) M*N 크기의 배추밭에 살아야 하는 배추흰지렁이의 마리 수 구하기
2. 입출력
// input
2 // 테스트 케이스의 개수
10 8 17 // M, N, K(배추의 위치)
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
// output
5
1
3. 코드
import java.util.*;
import java.awt.Point;
import java.io.*;
public class b1012 {
private static int M;
private static int N;
private static int K;
private static int[][] map;
private static boolean[][] visited;
private static int[] dr = {0, 1, 0, -1};
private static int[] dc = {1, 0, -1, 0};
private static int ans;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for(int t = 1; t <= T; t++) {
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
K = Integer.parseInt(st.nextToken()); // 배추의 개수
map = new int[M][N]; // 땅
visited = new boolean[M][N]; // 방문 여부
for(int k = 0; k < K; k++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
map[r][c] = 1; // 배추 심기
}
ans = 0; // 흰지렁이 개수
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
if(map[i][j] == 1 && !visited[i][j]) { // 배추가 심어져 있고, 방문 전이면
dfs(i, j); // dfs로 탐색
// bfs(i, j); // bfs로 탐색
ans++; // 흰지렁이 한 마리 추가
}
}
}
System.out.println(ans); // 출력
}
}
private static void dfs(int r, int c) {
// inductive part
for (int d = 0; d < 4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if(nr >= 0 && nr < M && nc >= 0 && nc < N && map[nr][nc] == 1) { // 범위 내에 배추가 있으면
if(!visited[nr][nc]) { // 방문 전이면
visited[nr][nc] = true; // 방문 처리
dfs(nr, nc); // 이어서 방문
}
}
}
}
private static void bfs(int r, int c) {
Queue<Point> Q = new LinkedList();
Q.add(new Point(r, c)); // 큐에 넣고
visited[r][c] = true; // 방문 처리
while(!Q.isEmpty()) {
Point p = Q.poll();
for (int d = 0; d < 4; d++) {
int nr = p.x + dr[d];
int nc = p.y + dc[d];
if(nr >= 0 && nr < M && nc >= 0 && nc < N && map[nr][nc] == 1 && !visited[nr][nc]) {
visited[nr][nc] = true;
Q.add(new Point(nr, nc));
}
}
}
}
}
실행 결과
4. 회고
1) 배추밭에 배추가 심어져 있으면 dfs/bfs로 탐색 후 흰지렁이의 개수를 추가함
-> dfs/bfs를 통해 인접한 배추를 방문 처리함
5. Github
https://github.com/iihye/Algorithm/blob/main/Baekjoon/b1012.java
728x90
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준]7576번 토마토(JAVA) (0) | 2023.08.10 |
---|---|
[백준]4963번 섬의 개수(JAVA) (0) | 2023.08.10 |
[백준]1158번 요세푸스 문제(JAVA) (0) | 2023.08.08 |
[백준]10163번 색종이(JAVA) (0) | 2023.08.07 |
[백준]13300번 방 배정(JAVA) (0) | 2023.08.07 |
Comments