티스토리 뷰

알고리즘

백준 - 1012 유기농 배추

쉬엄쉬엄하자 2020. 2. 6. 13:59
728x90

백준 사이트의 1012번 dfs문제 유기농 배추의 풀이법을 정리해보겠습니다. dfs가 아닌 bfs로도 풀이가 가능한 문제이지만 저는 dfs로 풀었습니다.

 

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. (

www.acmicpc.net

문제는 링크로 첨부하겠습니다.

이문제는 직관적으로 dfs를 수행하면 바로 해결이 가능한 문제입니다. 배추가 심어진 위치를 배열에 저장해놓고 배추가 심어진 위치를 만날때마다 dfs를 호출합니다. 그리고 방문한 위치는 표시해놓고 dfs함수 내부에서 현재 위치의 위아래좌우에 배추가 심어져있고 방분한적이 없을 경우 dfs함수를 재귀호출하여 이어진 배추의 개수를 구하면 됩니다.

 

다음은 제가 풀이한 소스코드입니다.

#include <iostream>
#include <algorithm>
#include <math.h>
#include <string>
#include <queue>

using namespace std;
int map[50][50];
int visit[50][50];
int block[50];
int block_num;
int T, M, N, K;

int index[4][2] = { {1,0}, {0,1}, {-1,0}, {0,-1} };//아래 오른쪽 위 왼쪽 순서대로

void dfs(int x, int y) {
	visit[x][y] = 1;
	//printf("%d %d\n", x, y);
	for (int i = 0; i < 4; i++) {
		int xIdx = x + index[i][0];
		int yIdx = y + index[i][1];
		if (xIdx < 0 || xIdx >= N || yIdx < 0 || yIdx >= M)
			continue;

		if (map[xIdx][yIdx] == 1 && visit[xIdx][yIdx] == 0) {
			dfs(xIdx, yIdx);
		}
	}
}

void sort() {

}

void debug() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			printf("%d", map[i][j]);
		}
		printf("\n");
	}
}
void clear() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			map[i][j] = 0;
			visit[i][j] = 0;
			block_num = 0;
		}
	}
}

int main()
{
	block_num = 0;
	scanf("%d", &T);
	for (int i = 0; i < T; i++) {
		scanf("%d %d %d", &M, &N, &K);
		for (int j = 0; j < K; j++) {
			int horizon, vertical;
			scanf("%d %d", &horizon, &vertical);
			map[vertical][horizon] = 1;
		}
		/*printf("\n");
		debug();*/
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (map[i][j] == 1 && visit[i][j] == 0) {
					dfs(i, j);
					block_num++;
				}
			}
		}
		block[i] = block_num;
		clear();
	}
	for(int i = 0; i < T; i++)
		printf("%d\n", block[i]);
}

'알고리즘' 카테고리의 다른 글

백준 2178 - 미로 탐색  (0) 2020.02.09
백준 6118번 - 숨바꼭질  (0) 2020.02.07
백준 2667번 - 단지번호붙이기 DFS풀이  (0) 2020.02.04
백준 1652번 - 누울 자리를 찾아라  (0) 2020.01.26
백준 1789 - 수들의 합  (0) 2020.01.26
댓글