Coding_Test_C++

BaekJoon 1303번: 전쟁 - 전투(C++)

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

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

풀이법

1) BFS를 활용하여, 칸의 개수를 구하고 이를 합으로 만들어보았다.

2) 구현이 어려운 부분이 아니나, n과 m의 순서를 입력 받는 것에 있어 문제에서 명시한 세로와 가로가 헷갈려서 헤맨 문제이다.

3) 기초 bfs/dfs 개념을 익히기에 가장 좋은 문제라고 생각한다. 

#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <math.h>
#include <map>
#define INF 987654321
using namespace std;

int vx[4] = { 1,0,0,-1 };
int vy[4] = { 0,1,-1,0 };
int n, m;
char arr[101][101];
bool visited[101][101];
int bfs(int a, int b, char tmp)
{
	int ccnt = 0;
	visited[a][b] = true;
	queue < pair<int, int>> q;
	q.push({ a,b });
	while (!q.empty())
	{
		int nowX = q.front().first;
		int nowY = q.front().second;
		ccnt++;
		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int nextX = nowX + vx[i];
			int nextY = nowY + vy[i];

			if (nextX < 0 || nextY < 0 || nextX >= n || nextY >= m)
				continue;
			if (arr[nextX][nextY] == tmp && !visited[nextX][nextY])
			{
				visited[nextX][nextY] = true;
				q.push({ nextX,nextY });
			}
		}
	}
	return ccnt;
}
int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
	cin >> m>>n;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		for (int j = 0; j < m; j++)
		{
			arr[i][j] = s[j];
		}
	}
	int white = 0;
	int blue = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (arr[i][j] == 'W'&& !visited[i][j])
			{
				white += (int)pow(bfs(i, j,arr[i][j]), 2);
			}
			else if (arr[i][j] == 'B' && !visited[i][j])
			{
				blue += (int)pow(bfs(i, j,arr[i][j]), 2);
			}
		}	
	}
	cout << white << " " << blue;
}

'Coding_Test_C++' 카테고리의 다른 글

BaekJoon 5430번: AC(C++)  (0) 2021.07.20
BaekJoon 6118번: 숨바꼭질  (0) 2021.07.19
BaekJoon 2467번: 용액(C++)  (0) 2021.07.18
BaekJoon 17070번: 파이프 옮기기 1(C++)  (0) 2021.07.16
BaekJoon 15686번: 치킨 배달(C++)  (0) 2021.07.15