GitHubSeob

C++ / 백준 / 3184 / 양 본문

Baekjoon/Silver

C++ / 백준 / 3184 / 양

GitHubSeob 2021. 9. 24.

문제

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

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net

문제풀이

DFS로 풀었다.

visit함수를 따로 만들지 않고 방문을 했으면 #표시를 했다.

울타리 안에서 상하좌우 어디로든 갈 수 있다.

전역 변수로 양 o, 늑대 v를 만들어서 메인 문에서 o과 v를 초기화하고 DFS함수를 실행한다.

메인 문에서 DFS는 #를 제외한., v, o일 때만 실행한다.

근처에 가지 않은 곳은 울타리밖에 없어 더 이상 갈 수 없을 때 메인 문으로 돌아온다.

그때 양과 늑대의 수를 비교해서 양이 더 많을 경우 양의 수만 answer.first에 더하고 그 외에는 answer.second에 늑대의 수만 더한다.

모든 DFS문이 끝나면 양과 늑대의 수를 출력한다.

 

코드

#include <iostream>
#include <vector>
using namespace std;

vector<vector<char>>yard;
vector<vector<int>>loc = { {-1,0},{1,0},{0,-1},{0,1} };

int o, v;
int R, C;

void DFS(int y, int x) {
	if (yard[y][x] == 'o') o++;
	else if (yard[y][x] == 'v') v++;
	yard[y][x] = '#';
	for (int idx = 0; idx < 4; ++idx) {
		int n_y = y + loc[idx][0];
		int n_x = x + loc[idx][1];
		if (n_y >= 0 && n_y < R && n_x >= 0 && n_x < C)
			if (yard[n_y][n_x] != '#')
				DFS(n_y, n_x);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> R >> C;
	yard = vector<vector<char>>(R, vector<char>(C, ' '));
	int y = 0, x = 0;
	for (y = 0; y < R; ++y)
		for (x = 0; x < C; ++x)
			cin >> yard[y][x];

	pair<int, int>answer;

	for (y = 0; y < R; ++y) {
		for (x = 0; x < C; ++x) {
			o = 0, v = 0;
			if (yard[y][x] != '#') {
				DFS(y, x);
				if (o > v) answer.first += o;
				else answer.second += v;
			}
		}
	}
	cout << answer.first << " " << answer.second;
}

'Baekjoon > Silver' 카테고리의 다른 글

C++ / 백준 / 1182 / 부분수열의 합  (0) 2021.10.03
C++ / 백준 / 6603 / 로또  (0) 2021.10.03
C++ / 백준 / 2251 / 물통  (0) 2021.09.18
C++ / 백준 / 1697 / 숨바꼭질  (0) 2021.09.12
C++ / 백준 / 10971 / 외판원 순회2  (0) 2021.09.09