- 이차원 배열 사용법 헷갈리지 말기
- 클래스로 구현하는 것도 좋음 Node
- dfs는 재귀로 구현
- bfs는 반복문으로 큐를 사용해서 구현
- 행과 열 반대로 넣어주지 말기 배열은 [행][열] 이기 때문
- 가로 길이 => 열의 값(y)
- 세로 길이 => 행의 값(x)
DFS로 구현
import java.util.*;
import java.io.*;
public class Main{
static int[][] map;
static boolean[][] visited;
static int n, m;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
for(int i=0;i<t;i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
map = new int[n][m];
visited = new boolean[n][m];
for(int j=0; j<k; j++) {
st = new StringTokenizer(br.readLine(), " ");
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
map[x][y] = 1;
}
int count = 0;
for(int p=0;p<n;p++) {
for(int l=0; l<m; l++) {
if(map[p][l]==1 && !visited[p][l]) {
dfs(p,l);
count ++;
}
}
}
bw.write(count+"\n");
}
bw.flush();
bw.close();
br.close();
}
public static void dfs(int x, int y) {
visited[x][y] = true;
for(int i=0; i<4; i++) {
int nx = x +dx[i];
int ny = y +dy[i];
if(nx>=0 && nx <n && ny >= 0 && ny < m) {
if(map[nx][ny]==1 && !visited[nx][ny]) {
dfs(nx, ny);
}
}
}
}
}
BFS로 구현
import java.util.*;
import java.io.*;
public class Main{
static int[][] map;
static boolean[][] visited;
static int n, m;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
static class Node {
int x;
int y;
Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
for(int i=0;i<t;i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
map = new int[n][m];
visited = new boolean[n][m];
for(int j=0; j<k; j++) {
st = new StringTokenizer(br.readLine(), " ");
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
map[x][y] = 1;
}
int count = 0;
for(int p=0;p<n;p++) {
for(int l=0; l<m; l++) {
if(map[p][l]==1 && !visited[p][l]) {
bfs(p,l);
count ++;
}
}
}
bw.write(count+"\n");
}
bw.flush();
bw.close();
br.close();
}
public static void bfs(int x, int y) {
Queue<Node> queue = new ArrayDeque<>();
queue.offer(new Node(x, y));
visited[x][y] = true;
while (!queue.isEmpty()) {
Node curNode = queue.poll();
for(int i=0; i<4; i++) {
int nx = curNode.x +dx[i];
int ny = curNode.y +dy[i];
if(nx>=0 && nx <n && ny >= 0 && ny < m) {
if(map[nx][ny]==1 && !visited[nx][ny]) {
queue.offer(new Node(nx, ny));
visited[nx][ny] = true;
}
}
}
}
}
}