티스토리 뷰
1. 벽을 3개 세우기 위해 DFS 완전탐색을 시작한다.
2. 중복을 피하기 위해, 현재 시작점으로부터 오른쪽, 아래쪽 방향으로만 탐색을 진행한다.
3. 벽을 3개 세웠으면, 그 상태에서 BFS 탐색으로 바이러스를 퍼뜨린다.
4. 바이러스를 모두 퍼뜨렸으면, 안전지대를 세서 출력한다.
[중복이 발생하는 코드]
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 | public static void dfs(int numOfWall, int[][] prev) { int[][] temp = new int[N][M]; for (int i = 0; i < N; i++) temp[i] = Arrays.copyOf(prev[i], prev[i].length); if (numOfWall == 3) { bfs(temp); ans = Math.max(ans, countSafety(temp)); return; } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (temp[i][j] == 0) { temp[i][j] = 1; dfs(numOfWall + 1, temp); temp[i][j] = 0; } } } } | cs |
[중복이 발생하지 않는 코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public static void dfs(int start, int numOfWall, int[][] prev) { int[][] temp = new int[N][M]; for (int i = 0; i < N; i++) temp[i] = Arrays.copyOf(prev[i], prev[i].length); if (numOfWall == 3) { bfs(temp); ans = Math.max(ans, countSafety(temp)); return; } for (int i = start; i < N * M; i++) { int row = i / M; int col = i % M; if (temp[row][col] == 0) { temp[row][col] = 1; dfs(i + 1, numOfWall + 1, temp); temp[row][col] = 0; } } } | cs |
[소스 코드]
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int N, M, ans = 0; public static int[][] map; public static int[] dirX = new int[] { 0, 0, 1, -1 }; // 동 서 남 북 public static int[] dirY = new int[] { 1, -1, 0, 0 }; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); map = new int[N][M]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < M; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } dfs(0, 0, map); System.out.println(ans); } public static void bfs(int[][] prev) { Queue<Node> q = new LinkedList<>(); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (prev[i][j] == 2) { q.offer(new Node(i, j)); } } } while (!q.isEmpty()) { Node node = q.poll(); int row = node.row; int col = node.col; for (int i = 0; i < 4; i++) { int nr = row + dirX[i]; int nc = col + dirY[i]; if (isBoundary(nr, nc) && prev[nr][nc] == 0) { prev[nr][nc] = 2; q.offer(new Node(nr, nc)); } } } } public static void dfs(int start, int numOfWall, int[][] prev) { int[][] temp = new int[N][M]; for (int i = 0; i < N; i++) temp[i] = Arrays.copyOf(prev[i], prev[i].length); if (numOfWall == 3) { bfs(temp); ans = Math.max(ans, countSafety(temp)); return; } for (int i = start; i < N * M; i++) { int row = i / M; int col = i % M; if (temp[row][col] == 0) { temp[row][col] = 1; dfs(i + 1, numOfWall + 1, temp); temp[row][col] = 0; } } } public static int countSafety(int[][] map) { int count = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (map[i][j] == 0) count += 1; } } return count; } public static void showMap(int[][] prev) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { System.out.print(prev[i][j] + " "); } System.out.println(); } System.out.println(); } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < M); } } class Node { int row; int col; public Node(int row, int col) { this.row = row; this.col = col; } } | cs |
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
[백준 2252번] 줄 세우기 :: 늦깎이 IT (0) | 2019.03.19 |
---|---|
[백준 14503번] 로봇 청소기 :: 늦깎이 IT (0) | 2019.03.19 |
[백준 3190번] 뱀 :: 늦깎이 IT (0) | 2019.03.18 |
[백준 13460번] 구슬 탈출2 :: 늦깎이 IT (0) | 2019.03.12 |
[백준 14888번] 연산자 끼워넣기 :: 늦깎이 IT (0) | 2019.03.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 배열
- 영역 구하기
- 탈주범 검거
- 리스트
- 14888
- 정렬
- 자바
- 삼성
- 중간값
- 최대힙
- DFS
- 우선순위 큐
- 시뮬레이션
- 나무 재테크
- 힙
- 알고리즘
- 알고스팟
- 큐
- 브루트포스
- 구현
- 탐색
- 백준
- SWEA
- BFS
- 힙정렬
- 트리
- 최소힙
- 연산자 끼워넣기
- 구슬 탈출2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함