[C++]백준1012번 유기농 배추

2 minute read

오늘은 백준1012번 유기농 배추 문제를 풀어보도록 하자.

BFS, DFS 모두 가능한 문제로 두 가지 방법으로 풀어보았다. 기본적인 BFS, DFS 개념을 습득하기 위해 좋은 문제이다.

문제는 다음과 같다.

                               [접근법]

  1. BFS - 큐를 이용

  2. DFS - 재귀를 이용
                                     [코드]
                                     
                                     ___BFS___
#include <iostream>
#include <queue>
using namespace std;

int map[50][50];
bool visit[50][50];
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int cnt = 0, R, C;
struct pos {
	int y;
	int x;
};
queue<pos>Q;

void Init() { //초기화
	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			map[i][j] = 0;
			visit[i][j] = false;
		}
	}
	cnt = 0;
}

bool Inbound(int y, int x) {//경계조건
	if (y >= 0 && y < R && x >= 0 && x < C) {
		return true;
	}
	return false;
}

void cnt_the_worm() {
	while (!Q.empty()) {
		int size_of_Q = Q.size();

		for (int i = 0; i < size_of_Q; i++) {
			int y = Q.front().y;
			int x = Q.front().x;

			Q.pop();

			for (int j = 0; j < 4; j++) {
				int my = y + dir[j][0];
				int mx = x + dir[j][1];

				if (Inbound(my, mx)) {
					if (map[my][mx] == 1 && !visit[my][mx]) {
						visit[my][mx] = true;
						Q.push({ my,mx });
					}
				}
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int Testcase, num, x, y;

	cin >> Testcase;
	
	while (Testcase--) {
		cin >> C >> R >> num;

		for (int i = 0; i < num; i++) {
			cin >> x >> y;
			map[y][x] = 1;
		}
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (map[i][j] == 1 && !visit[i][j]) {
					Q.push({ i,j }); visit[i][j] = true; cnt++;
					cnt_the_worm();
				}
			}
		}
		cout << cnt << '\n';
		Init();
	}
}


                                     ___DFS___
#include <iostream>
using namespace std;

int map[50][50];
bool visit[50][50];
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int cnt = 0, R, C;


void Init() { //초기화
	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			map[i][j] = 0;
			visit[i][j] = false;
		}
	}
	cnt = 0;
}

bool Inbound(int y, int x) {//경계조건
	if (y >= 0 && y < R && x >= 0 && x < C) {
		return true;
	}
	return false;
}

void cnt_the_worm(int y, int x) {
	visit[y][x] = true;	

	for (int i = 0; i < 4; i++) {
		int my = y + dir[i][0];
		int mx = x + dir[i][1];

		if (Inbound(my, mx)) {
			if (map[my][mx] == 1 && !visit[my][mx]) {
				cnt_the_worm(my, mx);
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int Testcase, num, x, y;

	cin >> Testcase;
	
	while (Testcase--) {
		cin >> C >> R >> num;

		for (int i = 0; i < num; i++) {
			cin >> x >> y;
			map[y][x] = 1;
		}
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (map[i][j] == 1 && !visit[i][j]) {
					cnt++;
					cnt_the_worm(i,j);
				}
			}
		}
		cout << cnt << '\n';
		Init();
	}
}