반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2468 안전 영역 본문

백준(Baekjoon) 문제

백준 2468 안전 영역

huiung 2019. 2. 7. 23:34
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 n*n 배열에 지역의 높이 정보를 입력받고 비가 n만큼 올때 높이가 n이하인 영역이 잠기게되며 그때 생겨날 수 있는 영역의 개수중 최대 개수를 구하는 문제입니다. 이 문제는 dfs 나 bfs를 이용하여 풀면 되는데 저는 bfs를 이용하여 풀었습니다.

 

낮은 높이부터 시작하여 저는 잠기는 배열의 요소는 그냥 임의적으로 102라는 숫자로 채웠습니다. 그런다음 잠겨진 상태의 배열에서 bfs가 행해지는 횟수가 영역의 개수가 되므로 그 부분을 계속 비교해주며 최대 개수를 구하면 됩니다.

 

다음은 코드입니다. 

 

#include <iostream>
#include <queue>

using namespace std;

int area[101][101];
int visited[101][101];
int nextx[4] = {1,0,-1,0};
int nexty[4] = {0,1,0,-1};
int maxnum; //최대 영역의 개수 
int N; //배열 사이즈 
queue<pair<int, int>> q;

void bfs() {
	while(!q.empty()) {
		
		for(int i = 0; i < 4; i++) {			
			if(q.front().first+nextx[i] < 0 || q.front().first+nextx[i] >= N || q.front().second+nexty[i] < 0 || q.front().second+nexty[i] >= N ) //범위 검사 
				continue;
					
			if(visited[q.front().first+nextx[i]][q.front().second+nexty[i]] == 0 && area[q.front().first+nextx[i]][q.front().second+nexty[i]] != 102) { //방문안하였다면 방문 시킴 
				q.push(make_pair(q.front().first+nextx[i], q.front().second+nexty[i]));
				visited[q.front().first+nextx[i]][q.front().second+nexty[i]] = 1;
			}
		}
		q.pop();
	}
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N;
	int maxheight = 0;
	int groupnum = 0;
	
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++) {
			cin >> area[i][j];
			if(maxheight < area[i][j]) //최고 높이를 저장함 
				maxheight = area[i][j];
			}
	
	for(int k = 0; k < maxheight; k++) { //최고 높이까지 탐색 시작 
		for(int i = 0; i < N; i++)
			for(int j = 0; j < N; j++) //k높이 이하의 요소에는 102를 저장(그냥임의적인 숫자) 
				if(area[i][j] <= k)
					area[i][j] = 102;
		
		groupnum = 0;
		
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				if(area[i][j] != 102 && visited[i][j] == 0) { //방문안한 지점이면 bfs 
					q.push(make_pair(i, j));
					visited[i][j] = 1;
					bfs();
					groupnum++; //bfs를 한 횟수가 그 배열에서의 영역 개수 
				}
			}
		}
		if (maxnum < groupnum)
			maxnum = groupnum;
		
		for(int i = 0; i < 101; i++)
			fill_n(visited[i], 101, 0); //visited 배열 0으로 초기화 
	}
	
	cout<<maxnum;
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1987 알파벳  (0) 2019.02.08
백준 9663 N-Queen  (0) 2019.02.08
백준 7576 토마토  (0) 2019.02.07
백준 1260 DFS와 BFS  (0) 2019.02.07
백준 10971 외판원 순회2  (0) 2019.02.06