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

 

이번에 볼 문제는 백준 27115번 문제인 통신소이다.
문제는 아래 링크를 확인하자.

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

 

27115번: 통신소

대한민국 공군은 비행하는 전투기와 지상에서 원활하게 통신하기 위하여 여러 위치에 통신소를 설치하였다. 지금까지 $K$개의 통신소를 배치하였는데, 각 통신소는 $\left(y_i,x_i\right)$의 위치에서

www.acmicpc.net

주어지는 K개의 통신소 중 적어도 하나와 통신할 수 있는 격자 내의 칸의 개수를 세는 문제이다.

 

주어진 격자 위에서 각 통신소마다 통신이 가능한 격자를 칠하는 것을 반복하면 답은 구할 수 있겠지만, 문제를 해결하기에 시간복잡도가 충분하지 않다. 대신 전파의 세기 w를 3000부터 1씩 줄여가며 현재 위치가 전파 세기 w의 통신소와 같은 기능을 할 수 있는 칸들을 차례대로 칠해나가는 것으로 문제를 해결하자. 이 때, 각 칸에 접근하는 횟수는 많아야 4회(상하좌우 네 방향; 해당 위치에 다른 통신소를 세우려고 시도하는 경우 제외)임을 관찰하자. 즉, 이와 같은 방법은 문제를 해결하기에 충분한 시간복잡도(O(NM))를 갖는다.

 

위의 방법은 아래와 같이 BFS와 같은 원리로 구현 가능하다, 

 

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

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

int R, C, K;
int board[3000][3000];
vector<pair<int, pair<int, int>>> vec;
queue<pair<int, int>> que;

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

int ans;

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

	cin >> R >> C >> K;
	while (K--) {
		int r, c, w; cin >> r >> c >> w;
		vec.emplace_back(make_pair(w, make_pair(r - 1, c - 1)));
	}

	sort(vec.begin(), vec.end());

	for (int w = 3000; w > 0; w--) {
		while (!vec.empty() && vec.back().first == w) {
			if (!board[vec.back().second.first][vec.back().second.second]) {
				board[vec.back().second.first][vec.back().second.second] = 1;
				que.push(vec.back().second);
			}
			vec.pop_back();
		}
		int qsize = que.size();
		while (qsize--) {
			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;
				board[rr][cc] = 1;
				que.push(make_pair(rr, cc));
			}
		}
	}

	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			ans += board[r][c];
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 10994 // C++] 별 찍기 - 19  (0) 2023.01.28
[BOJ 10819 // C++] 차이를 최대로  (0) 2023.01.27
[BOJ 27113 // C++] 잠입  (0) 2023.01.26
[BOJ 27114 // C++] 조교의 맹연습  (0) 2023.01.26
[BOJ 25375 // C++] 아주 간단한 문제  (0) 2023.01.26

+ Recent posts