Skip to content

Commit aa9c97b

Browse files
authored
Merge pull request #432 from AlgorithmWithGod/lkhyun
[20250710] BOJ / G2 / 벽 부수고 이동하기 4 / 이강현
2 parents 5db55e1 + 6d9000d commit aa9c97b

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
public class Main {
5+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
6+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
7+
static StringTokenizer st;
8+
static int N,M;
9+
static int[][] matrix;
10+
static Map<String,String> parent;
11+
static Map<String,Integer> dp;
12+
static int[] di = {0,0,-1,1};
13+
static int[] dj = {-1,1,0,0};
14+
15+
public static void main(String[] args) throws IOException {
16+
st = new StringTokenizer(br.readLine());
17+
N = Integer.parseInt(st.nextToken());
18+
M = Integer.parseInt(st.nextToken());
19+
matrix = new int[N][M];
20+
21+
for (int i = 0; i < N; i++) {
22+
String line = br.readLine();
23+
for (int j = 0; j < M; j++) {
24+
matrix[i][j] = line.charAt(j) - '0';
25+
}
26+
}
27+
28+
// 모여있는 0들 찾기
29+
parent = new HashMap<>();
30+
dp = new HashMap<>();
31+
boolean[][] visited = new boolean[N][M];
32+
for (int i = 0; i < N; i++) {
33+
for (int j = 0; j < M; j++) {
34+
if(matrix[i][j] == 0 && !visited[i][j]){
35+
BFS(i,j,visited);
36+
}
37+
}
38+
}
39+
40+
//1인 곳마다 인접하고 있는 0 그룹들 더해주기
41+
StringBuilder sb = new StringBuilder();
42+
for (int i = 0; i < N; i++) {
43+
for (int j = 0; j < M; j++) {
44+
if(matrix[i][j] == 1){
45+
List<String> added = new ArrayList<>();
46+
for (int k = 0; k < 4; k++) {
47+
int ni = i + di[k];
48+
int nj = j + dj[k];
49+
if(ni<0 || ni>=N || nj<0 || nj>=M) continue;
50+
if(matrix[ni][nj] == 0){
51+
String cur = ni+" "+nj;
52+
String root = parent.get(cur);
53+
if(added.contains(root)) continue;
54+
matrix[i][j] += dp.get(root);
55+
added.add(root);
56+
}
57+
}
58+
if(matrix[i][j] % 10 != 0){
59+
sb.append(matrix[i][j]%10);
60+
}else{
61+
sb.append("0");
62+
}
63+
}else{
64+
sb.append("0");
65+
}
66+
}
67+
sb.append('\n');
68+
}
69+
bw.write(sb.toString());
70+
bw.close();
71+
}
72+
static void BFS(int i, int j, boolean[][] visited){
73+
ArrayDeque<int[]> q = new ArrayDeque<>();
74+
q.add(new int[]{i,j});
75+
visited[i][j] = true;
76+
77+
String start = i+" "+j;
78+
int cnt = 0;
79+
80+
parent.put(start,start);
81+
82+
while(!q.isEmpty()){
83+
int[] cur = q.poll();
84+
cnt++;
85+
86+
for (int k = 0; k < 4; k++) {
87+
int ni = cur[0] + di[k];
88+
int nj = cur[1] + dj[k];
89+
90+
if(ni<0 || ni>=N || nj<0 || nj>=M || visited[ni][nj]) continue;
91+
92+
if(matrix[ni][nj] == 0){
93+
visited[ni][nj] = true;
94+
parent.put(ni+" "+nj, start);
95+
q.add(new int[]{ni,nj});
96+
}
97+
}
98+
}
99+
dp.put(start,cnt);
100+
}
101+
}
102+
103+
```

0 commit comments

Comments
 (0)