※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3184번 문제인 양이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/3184
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
'#'으로 구분되어 있는 각 영역마다 해당 영역의 양과 늑대의 마릿수를 셀 수 있다면 문제를 해결할 수 있을 것이다. 이는 BFS 등의 그래프 탐색 알고리즘을 이용하여 해낼 수 있다.
양과 늑대가 있을 수 없는 '.' 위치를 경계를 포함하여 양과 늑대가 없는 영역으로 생각하더라도 이러한 영역들은 문제의 답에 영향을 주지 않으므로 영역의 구분을 신경쓰면서 구현할 필요는 없다.
만약 '.'을 찾을 때마다 새로운 영역을 찾은 것으로 생각해 영역을 탐색하는 코드를 작성한다면 틀렸습니다를 받을 것이다. 모든 칸에 양 또는 늑대가 들어있는 영역이 존재할 수 있고 그러한 영역에는 '.'이 포함되어 있지 않기 때문이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
int R, C;
string board[250];
int ocnt, vcnt;
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };
void bfs(int qr, int qc) {
int O = 0, V = 0;
if (board[qr][qc] == 'o') O++;
else if (board[qr][qc] == 'v') V++;
board[qr][qc] = '#';
queue<pair<int, int>> que;
que.push(make_pair(qr, qc));
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < 4; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 0 || rr >= R || cc < 0 || cc >= C || board[rr][cc] == '#') continue;
if (board[rr][cc] == 'o') O++;
else if (board[rr][cc] == 'v') V++;
board[rr][cc] = '#';
que.push(make_pair(rr, cc));
}
}
if (O > V) ocnt += O;
else vcnt += V;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
for (int r = 0; r < R; r++) cin >> board[r];
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (board[r][c] != '#') {
bfs(r, c);
}
}
}
cout << ocnt << ' ' << vcnt;
}
'BOJ' 카테고리의 다른 글
[BOJ 16172 // C++] 나는 친구가 적다 (Large) (0) | 2023.02.16 |
---|---|
[BOJ 3181 // C++] 줄임말 만들기 (0) | 2023.02.16 |
[BOJ 1907 // C++] 탄소 화합물 (0) | 2023.02.16 |
[BOJ 24444 // C++] 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.02.15 |
[BOJ 24446 // C++] 알고리즘 수업 - 너비 우선 탐색 3 (0) | 2023.02.15 |