알고리즘
- 그래프 이론
- 그래프 탐색
- 너비 우선 탐색
- 깊이 우선 탐색

static int N;
static int M;
static int K;
static int map[][];
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
static boolean[][] visit;
static int cnt;
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int t=0; t<T; t++){
cnt = 0;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<K; i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map[x][y] = 1;
} //배추 위치 입력
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
if(map[i][j]==1 && !visit[i][j]){
DFS(i,j);
cnt++;
}
}
}
System.out.println(cnt);
public static void DFS(int x, int y){
visit[x][y] = true; //각 위치에 대한 방문표시
for(int i=0; i<4; i++){ //상하좌우 인접한 위치 탐색
int next_x = x + dx[i];
int next_y = y + dy[i];
// 이동한 위치가 범위 내에 있는지 확인
if (next_x >= 0 && next_y >= 0 && next_x < N && next_y < M) {
if (map[next_x][next_y] == 1 && !visit[next_x][next_y]) { // 이동한 위치에 배추가 심어져 있고, 아직 방문하지 않았다면 DFS를 호출
DFS(next_x, next_y);
}
}
}
}
package alss3;
import java.util.*;
import java.io.*;
public class Week10{
static int N;
static int M;
static int K;
static int map[][];
//상하좌우
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
static boolean[][] visit; //방문처리를 위한 배열
static int cnt;
public static void main(String[] args) throws IOException{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int t=0; t<T; t++){
cnt = 0;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<K; i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map[x][y] = 1;
} //배추 위치 입력
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
if(map[i][j]==1 && !visit[i][j]){
DFS(i,j);
cnt++;
}
}
}
System.out.println(cnt);
}
}
//DFS 함수 구현
public static void DFS(int x, int y){
visit[x][y] = true;
for(int i=0; i<4; i++){
int next_x = x + dx[i];
int next_y = y + dy[i];
if (next_x >= 0 && next_y >= 0 && next_x < N && next_y < M) {
if (map[next_x][next_y] == 1 && !visit[next_x][next_y]) {
DFS(next_x, next_y);
}
}
}
}
}