거의 알고리즘 일기장

유기농 배추_ 백준 1012번 본문

알고리즘 문제풀이

유기농 배추_ 백준 1012번

건우권 2020. 4. 2. 15:28

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

 

1012번: 유기농 배추

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

www.acmicpc.net

 

1. 풀이 방법

 

일반적인 dfs풀이 + dfs가 몇번 호출되었나 세어주면 된다.

주의할 사항은 y, x순 입력이 아니라 x, y순 입력이라는것과 map과 visit배열을 testcase가 바뀔때마다 초기화시켜주어야 하는것 정도이다.

 

 

 

2. 코드

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int map[52][52];
bool visit[52][52];
int k, n, m;

void mapVisitErase()
{
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			map[i][j] = visit[i][j] = 0;
}

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

	if (y - 1 >= 0)
		if (map[y - 1][x])
			if (visit[y - 1][x] == false)
				dfs(y - 1, x);

	if (y + 1 < n)
		if (map[y + 1][x])
			if (visit[y + 1][x] == false)
				dfs(y + 1, x);

	if (x - 1 >= 0)
		if (map[y][x - 1])
			if (visit[y][x - 1] == false)
				dfs(y, x - 1);

	if (x + 1 < m)
		if (map[y][x + 1] )
			if (visit[y][x + 1] == false)
				dfs(y, x + 1);
}


int main()
{
	int testcase;
	cin >> testcase;

	for (int c = 0; c < testcase; c++)
	{
		cin >> m >> n >> k;
		
		//map에 지렁이 넣기
		int y, x;
		for (int kc = 0; kc < k; kc++)
		{
			cin >> x >> y;
			map[y][x] = 1;
		}

		//지렁이 수 세기
		int cnt = 0;
		for(int i =0; i<n; i++)
			for (int j = 0; j < m; j++)
			{
				if (map[i][j] == 1 && visit[i][j] == false)
				{
					//dfs
					dfs(i, j);
					cnt++;
				}
			}

		cout << cnt << '\n';

		mapVisitErase();
	}

	return 0;
}

 

 

 

3. 후기

 

최근에 풀던 카카오 문제들이 손대는것마다 좌절감만 안겨줘서 좀 쉬운 문제를 풀어보자 해서 풀어보게 되었다.

물론 쉬운문제지만 혹시 좌표를 헷갈린다거나 초기화를 제때 안해주면 주어지는 테스트 케이스로는 판별할수 없어 삽질할수도 있다.

반응형
Comments