※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 11123번 문제인 양 한마리... 양 두마리...이다.
문제는 아래 링크를 확인하자.

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

 

11123번: 양 한마리... 양 두마리...

얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지.  그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세봐!"  

www.acmicpc.net

주어진 격자판의 '#'을 노드로, 인접한 '#'끼리의 관계를 에지로 모델링한 그래프의 connected component의 개수를 세는 문제이다.

 

connected component의 개수는 dfs, bfs등의 그래프탐색이나 disjoint set 등을 이용해 셀 수 있다. 글쓴이는 bfs를 이용해 문제를 해결하였다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int T;
int R, C;
string board[100];
int visited[100][100];

int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };

queue<pair<int, int>> que;

void bfs(int sR, int sC) {
	visited[sR][sC] = 1;
	que.push(make_pair(sR, sC));

	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) continue;
			if (board[rr][cc] == '#' && !visited[rr][cc]) {
				visited[rr][cc] = 1;
				que.push(make_pair(rr, cc));
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) {
		int ans = 0;
		memset(visited, 0, sizeof(visited));
		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] == '#' && !visited[r][c]) {
					ans++;
					bfs(r, c);
				}
			}
		}

		cout << ans << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1888 // C++] 곰팡이  (0) 2024.01.31
[BOJ 1388 // C++] 바닥 장식  (1) 2024.01.30
[BOJ 2790 // C++] F7  (0) 2024.01.28
[BOJ 2784 // C++] 가로 세로 퍼즐  (1) 2024.01.27
[BOJ 2980 // C++] 도로와 신호등  (1) 2024.01.26

+ Recent posts