Skip to content

Commit 106f738

Browse files
authored
[프로그래머스 LV02] 석유 시추 (pccp 기출 2번) - BFS, 완탐
1 parent e120bc3 commit 106f738

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

hoseok/week35/ProgrammersPccp2.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
5+
static class Node {
6+
int r, c;
7+
8+
Node(int r, int c) {
9+
this.r = r;
10+
this.c = c;
11+
}
12+
}
13+
14+
private final int[] rows = {-1, 0, 1, 0};
15+
private final int[] cols = {0, 1, 0, -1};
16+
17+
private int n, m;
18+
private int[][] map;
19+
private int[][] visited;
20+
private Map<Integer, Integer> areaSizes = new HashMap<>();
21+
22+
public int solution(int[][] land) {
23+
map = land;
24+
n = map.length;
25+
m = map[0].length;
26+
visited = new int[n][m];
27+
28+
int areaNumber = 1;
29+
for (int i = 0; i < n; i++) {
30+
for (int j = 0; j < m; j++) {
31+
if (visited[i][j] == 0 && map[i][j] > 0) {
32+
int size = bfs(areaNumber, new Node(i, j));
33+
areaSizes.put(areaNumber++, size);
34+
}
35+
}
36+
}
37+
38+
int maxSum = 0;
39+
for (int i = 0; i < m; i++) {
40+
boolean[] areaVisited = new boolean[areaNumber];
41+
int currentSum = 0;
42+
for (int j = 0; j < n; j++) {
43+
if (map[j][i] == 1 && !areaVisited[visited[j][i]]) {
44+
areaVisited[visited[j][i]] = true;
45+
currentSum += areaSizes.get(visited[j][i]);
46+
}
47+
}
48+
maxSum = Math.max(currentSum, maxSum);
49+
}
50+
51+
return maxSum;
52+
}
53+
54+
public int bfs(int areaNumber, Node startNode) {
55+
Queue<Node> que = new LinkedList<>();
56+
visited[startNode.r][startNode.c] = areaNumber;
57+
que.offer(startNode);
58+
59+
int size = 1;
60+
while (!que.isEmpty()) {
61+
Node curNode = que.poll();
62+
63+
for (int i = 0; i < 4; i++) {
64+
int nextR = curNode.r + rows[i];
65+
int nextC = curNode.c + cols[i];
66+
67+
if (nextR < 0 || nextR >= n || nextC < 0 || nextC >= m) {
68+
continue;
69+
}
70+
if (visited[nextR][nextC] == 0 && map[nextR][nextC] == 1) {
71+
size++;
72+
visited[nextR][nextC] = areaNumber;
73+
que.offer(new Node(nextR, nextC));
74+
}
75+
}
76+
}
77+
return size;
78+
}
79+
}

0 commit comments

Comments
 (0)