본문 바로가기
백준 코딩테스트/실버

3187) 양치기 꿍 (C++)

by xortl98 2022. 6. 19.
728x90

 출처 

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

 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<queue>

using namespace std;

int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };

char map[251][251];
bool visited[251][251];

int N = 0, M = 0;
int result_sheep = 0, result_wolf = 0;

void BFS(int x, int y);

int main()
{
	cin >> N >> M;

	for (int i = 0; i < N; i++)
	{
		string input = "";
		cin >> input;
		for (int j = 0; j < M; j++)
		{
			map[i][j] = input[j];
			if (map[i][j] == '#') visited[i][j] = true;
		}
	}


	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			if (!visited[i][j])
			{
				BFS(i, j);
			}
		}
	}

	cout << result_sheep << " " << result_wolf;
}

void BFS(int x, int y)
{
	int sheep = 0;
	int wolf = 0;

	queue<pair<int, int>> q;
	q.push({ x,y });
	visited[x][y] = true;

	if (map[x][y] == 'k') sheep++;
	else if (map[x][y] == 'v') wolf++;

	while (!q.empty())
	{
		int cnt_x = q.front().first;
		int cnt_y = q.front().second;

		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int nx = cnt_x + dx[i];
			int ny = cnt_y + dy[i];

			if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;

			if (map[nx][ny] == '.' && !visited[nx][ny])
			{
				visited[nx][ny] = true;
				q.push({ nx,ny });
			}
			else if (map[nx][ny] == 'k' && !visited[nx][ny])
			{
				visited[nx][ny] = true;
				q.push({ nx,ny });
				sheep++;
			}
			else if (map[nx][ny] == 'v' && !visited[nx][ny])
			{
				visited[nx][ny] = true;
				q.push({ nx,ny });
				wolf++;
			}
		}
	}

	if (wolf >= sheep) result_wolf += wolf;
	else result_sheep += sheep;
}

해설

각 울타리 안에 있는걸 방처럼 생각해서 방마다 BFS를 실행해줘서 늑대가 양보다 같거나 많으면 result_wolf에 울타리 안에 있던 늑대를 전부 더해주었고 그렇지 않으면 양을 전부 더해주는걸 반복하였다.

 느낀점 

bbbbbbbbbb

'백준 코딩테스트 > 실버' 카테고리의 다른 글

1388) 바닥 장식  (0) 2022.06.18
5635) 생일 (C++)  (0) 2022.06.11
1748) 수 이어 쓰기 1 (C++)  (0) 2022.06.06
1057) 토너먼트 (C++)  (0) 2022.06.05
11931) 수 정렬하기 4 (C++)  (0) 2022.06.03