티스토리 뷰
1. 비가 내리지 않을 경우, 안전지대는 1로 초기화한다.
2. 비는 안전지대의 최대 높이만큼만 내리면 된다. 최대 높이보다 비가 더 많이 내릴 경우는 어차피 안전지대는 0이
되기 때문이다.
3. 비를 1씩 내릴때마다 Map의 값을 -1 해주며, BFS탐색을 하고 최대 값을 찾는다.
[소스 코드]
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int N, ans; static int[][] map; static int maxVal; static int[] dirX = new int[] { 0, 0, 1, -1 }; static int[] dirY = new int[] { 1, -1, 0, 0 }; static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; public static void main(String[] args) throws IOException { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); map = new int[N][N]; maxVal = 0; ans = 1; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); maxVal = Math.max(maxVal, map[i][j]); } } solve(); System.out.println(ans); } public static void solve() { for (int rain = 1; rain <= maxVal; rain++) { sink(); boolean[][] visited = new boolean[N][N]; int count = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (!visited[i][j] && map[i][j] > 0) { bfs(i, j, visited); count += 1; } } } ans = Math.max(ans, count); } } public static void bfs(int row, int col, boolean[][] visited) { Queue<Node> q = new LinkedList<>(); q.offer(new Node(row, col)); visited[row][col] = true; while (!q.isEmpty()) { Node node = q.poll(); for (int i = 0; i < 4; i++) { int nr = node.row + dirX[i]; int nc = node.col + dirY[i]; if (isBoundary(nr, nc) && !visited[nr][nc] && map[nr][nc] > 0) { visited[nr][nc] = true; q.offer(new Node(nr, nc)); } } } } public static void sink() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { map[i][j] -= 1; } } } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < N); } } class Node { int row; int col; public Node(int row, int col) { this.row = row; this.col = col; } } | cs |
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
[백준 2146번] 다리 만들기 :: 늦깎이 IT (0) | 2019.03.23 |
---|---|
[백준 2573번] 빙산 :: 늦깎이 IT (0) | 2019.03.23 |
[백준 9466번] 텀 프로젝트 :: 늦깎이 IT (0) | 2019.03.23 |
[백준 2504번] 괄호의 값 :: 늦깎이 IT (0) | 2019.03.22 |
[백준 1992번] 쿼드트리 :: 늦깎이 IT (0) | 2019.03.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 백준
- 큐
- 나무 재테크
- 힙
- 힙정렬
- 중간값
- 알고스팟
- SWEA
- 자바
- 배열
- 브루트포스
- 정렬
- BFS
- 리스트
- 탈주범 검거
- 영역 구하기
- 구슬 탈출2
- 최소힙
- 알고리즘
- DFS
- 우선순위 큐
- 연산자 끼워넣기
- 구현
- 탐색
- 14888
- 최대힙
- 트리
- 삼성
- 시뮬레이션
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함