그냥 블로그

[ 백준/C++ ] 2468 안전 영역 본문

C++/백준

[ 백준/C++ ] 2468 안전 영역

코딩하는 공대생 2023. 10. 12. 11:07
반응형

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

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

드디어 DFS, BFS에 들어왔습니다 ~ 

 

C++로 한층 성장한 느낌

 

사실 예전에 파이썬으로 한번 풀었던 문제인데, 그때도 한 조건 때문에 화가 났던 기억이 있음 ㅋㅋㅋ 

 

사실 BFS, DFS 만 할 줄 알면 굉장히 간단하게 풀리는 문제이다. 

 

 

 

[해답 코드]

#include<bits/stdc++.h>

using namespace std;

int N;
int region[104][104];
int visited[104][104];
int dy[] = { -1, 1, 0, 0 };
int dx[] = { 0, 0, -1, 1 };

int DFS(int y, int x, int h) {
	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 (region[ny][nx] > h && !visited[ny][nx]) DFS(ny, nx, h);
	}
	return 0;

}
int main() {
	cin >> N;
	fill(&region[0][0], &region[0][0]+104*104, 0);
	int max_v = -1;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> region[i][j];
		}
	}

	for (int h = 0; h <= 100; h++) {
		int ans = 0;
		fill(&visited[0][0], &visited[0][0] + 104 * 104, 0);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (region[i][j] > h && !visited[i][j]) {
					DFS(i, j, h);
					++ans;
				}
			}
		}
		max_v = max(max_v, ans);
	}
	cout << max_v;


}

 

사실 별로 어렵지 않아서 쓸 말도 없는데 그래도 고찰을 써봅시다

 

[고찰]

1. if(X==N-1 && Y==N-1) return; 

 이 구문을 쓰지 말아야 하는데 처음엔 별 생각없이 쓰다가 써버렸다 히하ㅏ.. 미로찾기 효과인듯? 그래도 금방 눈치채고 바꾸긴 했다. 

2. fill(&visited[0][0], &visited[0][0] + 104 * 104, 0);

  배열을 초기화 하는 fill() 함수이다. 1차원 배열일 때는 [0][0] 식으로 하지 않고 visited, visited + 104*104가 가능한데 2차원 배열에서는 안되는 듯 하다. 이건 아마 참조? 쪽을 공부해야 알 것 같은데 일단은 넘어가고 C++ 이론을 다시 차근 차근 보도록하자 

3. 배열을 틀리게 적었는데 왜 값이 들어가는 거죠 ???? 

  처음에 104로 적어야 하는데 실수로 04로 적었음 ;;; 아니 그러면 INDEX 에러를 띄워줘야 하는게 아닌ㄴ가????? 근데 그냥 값이 들어간느데 틀린 값이 계속 들어가지는 거임... 그래서 값이 계속 다르게 나와서 고생을 했다 ㅠ 삽질했어 

  이제 논리에 에러가 없는데 안되면 진짜 처음부터 다시 쓰는 걸 항상 생각하도록 하자...