카테고리 없음
[백준] | JAVA, 자바 | 2468번 - 안전 영역
inttype
2025. 3. 10. 20:04
https://www.acmicpc.net/problem/2468
문제 요약 :
1. 2차원 배열의 행과 열의 개수를 나타내는 수 N 입력받기
2. N번째 행까지 순서대로 한 행씩 높이 정보 입력받기
3. 물에 잠기지 않는 안전한 영역이라 함은 물에 잠기지 않는 지점들이 위, 아래, 오른쪽 혹은 왼쪽으로 인접해 있으며 그 크기가 최대인 영역을 말한다.
4. 어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산하는 프로그램을 작성
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int n;
private static int[][] map;
private static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. 2차원 배열의 행과 열의 개수를 나타내는 수 N 입력받기
n = Integer.parseInt(br.readLine());
map = new int[n][n];
int max = Integer.MIN_VALUE;
// 2. N번째 행까지 순서대로 한 행씩 높이 정보 입력받기
for(int i = 0; i < n; i++) {
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]);
}
}
// 아무 지역도 잠기지 않았을 때 안전한 영역은 1개가 있기 때문에 기본값으로 1 설정
int resultMax = 1;
for(int i = 0; i < max; i++) {
visited = new boolean[n][n];
int result = 0;
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
if(!visited[j][k] && map[j][k] > i) {
visited[j][k] = true;
result++;
search(i, j, k);
}
}
}
// 4. 어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산
if(result > resultMax) resultMax = result;
}
// 최대 개수 출력
System.out.println(resultMax);
}
// 3. 물에 잠기지 않는 안전한 영역 탐색
private static void search(int check, int x, int y) {
// 방문했거나 높이가 낮거나 같다면 return
if(visited[x][y] && map[x][y] <= check) return;
int[][] delta = {{1,0},{-1,0},{0,1},{0,-1}};
for(int i = 0; i < 4; i++) {
int nr = x + delta[i][0];
int nc = y + delta[i][1];
if(isRange(nr, nc) && !visited[nr][nc] && map[nr][nc] > check) {
visited[nr][nc] = true;
search(check, nr, nc);
}
}
}
private static boolean isRange(int nr, int nc) {
return nr >= 0 && nr < n && nc >= 0 && nc < n;
}
}