| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- dfs
- BFS
- level3
- 백준
- 구현
- 다이나믹프로그래밍
- lv2
- 통신 인터페이스
- cpp
- 다이나믹 프로그래밍
- C
- 프로그래머스
- c++
- 동적계획법
- 자바
- 컴퓨터비전
- java
- kotlin
- 코틀린
- 그리디
- 2018 KAKAO BLIND RECRUITMENT
- 누적합
- 임베디드
- level2
- dp
- 우선순위큐
- 컴퓨터 비전
- JavaScript
- 이분탐색
- Stack
Archives
- Today
- Total
코드를 느껴바라
2468번 : 안전 영역 [JAVA] 본문
문제 링크
성공 여부(걸린 시간): 성공(25분 52초)
아이디어
각 비가 올 수 있는 높이 마다
BFS를 돌며 최대 영역의 개수를 탐색한다.(개수가 아니라 너비로 보고 이해가 안되어서 시간을 좀 낭비함)
그래서 최악의 경우의 수를 가정해보면
그럼 높이가 최대 100이고 map의 최대넓이는 100100이므로
100번의 BFS를 돈다고 가정하고 사실 각 배열마다 탐색할 일은 문제의 가정상 별로 없겠지만
최악을 가정한다고 했을때그험 100100*100이므로 충분히 가능한 시간으로 보인다.
그래서 매 비의 높이에 맞워서 안전영역이 가능한 지점을 발견하면 BFS를 돌아서
안전 영역에 대한 개수를 세고 해당 비의 높이에 해당하는 안전영역의 수를
최대와 비교하여 출력해준다.
풀이코드
import java.io.*;
import java.util.*;
public class Main {
static int N, result;
static int [][] map;
static boolean [][] visited;
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];
result = 0;
int maxHeight = -1;
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++){
int height = Integer.parseInt(st.nextToken());
maxHeight = Math.max(maxHeight, height);
map[i][j] = height;
}
}
for(int rain=0; rain<=maxHeight; rain++){
//각 비의 높이 마다 BFS돌기
visited = new boolean[N][N];
int count = 0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(map[i][j]>rain && !visited[i][j]){
BFS(i, j, rain);
count++;
}
}
}
result = Math.max(result, count);
}
System.out.print(result);
}
static int [] dx = {1, 0, -1, 0};
static int [] dy = {0, 1, 0, -1};
static void BFS(int i, int j, int rain){
ArrayDeque<int []> q = new ArrayDeque<>();
q.add(new int[]{i, j});
visited[i][j] = true;
while (!q.isEmpty()){
int [] cur = q.poll();
int x = cur[0];
int y = cur[1];
for(int dir = 0; dir<4; dir++){
int mx = x+dx[dir];
int my = y+dy[dir];
if(canGo(mx, my)&&!visited[mx][my]&&map[mx][my]>rain){
q.add(new int []{mx, my});
visited[mx][my] = true;
}
}
}
}
static boolean canGo(int x, int y){
return x<N&&y<N&&x>=0&&y>=0;
}
}반응형
'PS > 백준(Baekjoon)' 카테고리의 다른 글
| 3109번 : 빵집 [JAVA] (0) | 2025.09.18 |
|---|---|
| 16920번 : 확장 게임 [JAVA] (0) | 2025.09.08 |
| 22866번 : 탑 보기 [JAVA] (2) | 2025.07.27 |
| 2234번 : 성곽 [JAVA] (0) | 2025.07.24 |
| 14890번 : 경사로 [JAVA] (0) | 2025.04.07 |
