https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
위 문제도 DFS로 풀어보았다.
음... 안전 영역을 찾기 위해 0~ 지역의 높이가 가장 높은 곳까지 대입하며 안전 지역이 가장 많은 곳을 찾았다.
코드(수정함)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Baek2468 {
public static int[][] map;
public static boolean[][] map_clone; // map에서 안전영역은 1, 아닌곳은 0을 넣은 배열
public static int N;
public static int dx[] = {-1, 1, 0, 0};
public static int dy[] = {0, 0, -1, 1};
//dx[], dy[]를 전역변수로 선언해서 사용해야 메모리를 많이많이 줄일 수 있다. 중요!
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N]; // map 배열 초기화
int max = 0;
for(int i = 0; i < N; i++) { // 입력된 값 map 배열에 넣고 안전영역 max 높이 찾아놓기
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
max = Math.max(max, map[i][j]);
}
}
int answer = 0;
for(int i = 0; i < max + 1; i++) { // 제일 높은곳까지만 넣어서 확인
int count = 0;
//map_clone 초기화
map_clone = new boolean[N][N];
//안전 영역 계산값 count[] 배열에 넣기
for(int j = 0; j < N; j++)
for(int k = 0; k < N; k++)
if(!map_clone[j][k] && map[j][k] >= i) { // 방문x & 높이 이상
count++;
safe_dfs(i, j, k);
}
answer = Math.max(answer, count);
}
System.out.println(answer);
}
public static void safe_dfs(int h, int x, int y) {
map_clone[x][y] = true;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx <= -1 || nx >= N || ny <= -1 || ny >= N) continue;
if(!map_clone[nx][ny] && map[nx][ny] >= h) {
safe_dfs(h, x + dx[i], y + dy[i]);
map_clone[x][y] = true;
}
}
}
}
지금 (20/01/24 18 : 13) 백준 사이트가 문제가 생겼는지 채점이 안된다.... 403 forbidden 뜨기 때문에
채점은 못했다. 근데 맞았을 것 같음...
그래서 성능은.. 나중에 생각나면 올려야겠다~~
그리고 나는 DFS를 풀 때 계속 저 코드를 사용하는데
남의 코드를 살펴보았더니
이런 느낌으로.. 풀기도 하는 것 같다.
거의 똑같긴 한데 암튼....~
+ 추가
메모리 초과로 틀려서 코드를 바꿔줬다.
dx[], dy[]를 safe_dfs() 함수 안에 넣어놨었는데 이렇게 하면 메모리초과가 뜬다^^
위에가 전역변수로 쓴거고 밑에가 함수 안에 넣어서 사용한거다.
당연히 재귀를 오지게 해야하니까.. 여러번 선언되면서 메모리 차지가 크겠구나....~
하나 배워간다~
'알고리즘 > 백준' 카테고리의 다른 글
[BaekJoon] 백준 1987번 _ 알파벳 for JAVA _ DFS 알고리즘 (0) | 2022.01.27 |
---|---|
[BaekJoon] 백준 10026번 _ 적록 색약 for JAVA _ DFS 알고리즘 (0) | 2022.01.25 |
[BaekJoon] 백준 4963번 _ 섬의 개수 for JAVA _ DFS 알고리즘 (0) | 2022.01.24 |
[BaekJoon] 백준 11724번 _ 연결 요소의 개수 for JAVA _ DFS 알고리즘 (0) | 2022.01.24 |
[BaekJoon] 백준 2178번 _ 미로탐색 for JAVA _ BFS 알고리즘 (0) | 2022.01.21 |