Boj 1012 유기농 배추

Updated:

문제 링크 : 백준 https://www.acmicpc.net/problem/1012

DFS Ver.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int map[][];
	static int T, R, C, baechu;
	static int answer;
	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 {

		T = Integer.parseInt(br.readLine());


		for (int tc = 0; tc < T; tc++) {
			answer=0;
			st = new StringTokenizer(br.readLine());
			R = Integer.parseInt(st.nextToken());
			C = Integer.parseInt(st.nextToken());
			baechu = Integer.parseInt(st.nextToken());
			map = new int[R + 1][C + 1];
			visited = new boolean[R + 1][C + 1];
			for (int i = 0; i < baechu; i++) {
				st = new StringTokenizer(br.readLine());
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());

				map[a][b] = 1;
			}

			for (int r = 0; r < R; r++) {
				for (int c = 0; c < C; c++) {
					if (map[r][c] == 1 && !visited[r][c]) {

						dfs(r, c);
						answer++;
					}
				}
			}

			System.out.println(answer);
		}
	}

	private static void dfs(int x, int y) {
		visited[x][y] = true;

		for (int i = 0; i < 4; i++) {
			int cx = x + dx[i];
			int cy = y + dy[i];

			if (cx >= 0 && cx < R && cy >= 0 && cy < C) {
				if (map[cx][cy] == 1 && !visited[cx][cy]) {
					dfs(cx, cy);
				}
			}
		}
	}
}

BFS Ver.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int map[][];
	static int T, M, N, baechu;
	static int answer;
	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 {

		// 테케
		T = Integer.parseInt(br.readLine());

		for (int tc = 0; tc < T; tc++) {
			answer = 0;
			st = new StringTokenizer(br.readLine());

			M = Integer.parseInt(st.nextToken());
			N = Integer.parseInt(st.nextToken());
			baechu = Integer.parseInt(st.nextToken());
			map = new int[M + 1][N + 1];
			visited = new boolean[M + 1][N + 1];
			// 배추 위치 입력
			for (int i = 0; i < baechu; i++) {
				st = new StringTokenizer(br.readLine());
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());
				map[a][b] = 1;
//				map[b][a] = 1;
			}

			for (int r = 0; r < M; r++) {
				for (int c = 0; c < N; c++) {
					if (map[r][c] == 1 && !visited[r][c]) {
						bfs(r, c);
						answer++;
					}
				}
			}

			System.out.println(answer);
		}
	}

	private static void bfs(int x, int y) {

		Queue<DOT> queue = new LinkedList<DOT>();
		visited[x][y] = true;
		queue.add(new DOT(x, y));

		while (!queue.isEmpty()) {

			DOT D = queue.poll();

			for (int i = 0; i < 4; i++) {
				int cx = D.x + dx[i];
				int cy = D.y + dy[i];

				if (cx >= 0 && cx < M && cy >= 0 && cy < N) {
					if(map[cx][cy]==1&&!visited[cx][cy]) {
						visited[cx][cy]=true;
						queue.add(new DOT(cx,cy));
					}
				}
			}

		}
	}
}

class DOT {
	int x;
	int y;

	public DOT(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
}

Leave a comment