c++/알고리즘

백준-2468 안전영역

hojung 2022. 3. 29.
728x90
반응형

1. 안전영역(DFS)

이 문제 또한 DFS를 활용하여 깊이 탐색을 하는 문제였다. 

앞서 문제와 한 가지 다른점은 앞서 유기농 배추 문제는 모든 배열의 값이 0아니면 1이 들어가서 바로 dfs를 탐색할 수 있었던 반면에 이 문제에서는 각 배열마다 다른 높이가 존재해서 높이를 비교하면서 가야한다는 점이 있었다. 

하지만 메모리 적으로 여유가 있어 나는 먼저 침수 높이d와 비교해 더 낮은 지대를 1의 값으로 갖는 비교 배열을 만들어준 후 앞선 유기농 배추 문제와 같이 dfs를 실행해주었다. 

dfs함수에서는 우선적으로 방문 배열을 1로 표시해주어야 하는 것이 중요하다는 것을 명심하자.

 

다음은 내가 문제를 푼 코드이다. 

#include<iostream>
#include<algorithm>
#include <tuple>
using namespace std;
int n;// 배열의 크기 가로 세로
int b[101][101];// 실제 map
int e[101][101]; 
int visited[101][101]; // 방문 배열
int dy[4] = {1, 0, -1, 0};
int dx[4] = {0,1,0,-1}; // 인덱스 배열
int ret = 1; // 연결된 컴포넌트 개수

int temp; 
void dfs(int y, int x) {
	visited[y][x]=1; // 방문 처리  
	for(int i = 0; i< 4; i ++){
		int ny = y + dy[i];
		int nx = x + dx[i];
		if(ny < 0 || nx < 0 || ny >= n || nx >=  n) continue; // 경계조건 
		if(visited[ny][nx] == 0 && e[ny][nx] == 0) // 방문 안했고 생성 배열 구역이 안전구역이라면 dfs
		{
			dfs(ny, nx);
		}
	}
	return; 
} 
int main()
{
	ios_base::sync_with_stdio(false);
	
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n; // 가로 세로 길이 입력
	for( int i=0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cin >> b[i][j];
		}
	} // 높이 입력
	
	for( int d=1; d < 101; d++){
		fill(&visited[0][0], &visited[0][0] + 101 * 101, 0);
		temp = 0;
		for(int i = 0; i < n; i ++){
			for(int j = 0; j< n; j++){
				if(e[i][j] == 1)continue;
				if(b[i][j] <= d) e[i][j] = 1;//1로 변환하는 배열 0이 안전 영역  
			}
		}
		for(int i = 0 ; i < n; i++){
			for(int j=0; j < n; j++){
				if(e[i][j] == 0 && !visited[i][j])
				{
					dfs(i, j);
					temp ++ ;
				}
			}
		}
		ret = max(ret, temp);
	}
	cout << ret << endl;
	return 0;
}

이 문제를 풀면서 새롭게 배운 c++의 함수는  max함수이다. 인자로 전달 받은 변수 중 가장 큰 것을 리턴한다. 

max(인수1, 인수2) ==  더 큰 인수 리턴

 

728x90
반응형

'c++ > 알고리즘' 카테고리의 다른 글

백준-4659 비밀번호 발음하기  (4) 2022.04.06
[C++] odd-Even Transposition Sort  (1) 2022.03.29
백준-1012번 - 유기농 배추  (0) 2022.03.29
백준2178번-미로BFS  (0) 2022.03.28
shell sort c++  (0) 2022.03.23

댓글