1. ๋ฌธ์ ์ค๋ช
๋ฒฝ์ด ๋ถ๋ถ์ ๋ถ์๊ณ ๊ฑฐ๊ธฐ์ ์ด๋ํ ์ ์๋ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ผ. ์๋ ๋ถํฐ 0์ด์๋ ๊ณต๊ฐ์ ๊ทธ๋ฅ 0์ผ๋ก ์ถ๋ ฅ, ์๋ 1(๋ฒฝ)์ด์๋ ๊ณต๊ฐ์ ๊ทธ ๋ฒฝ์ ๋ถ์๊ณ ์ข์ฐ๋ก ์ต๋ํ ์ด๋ํ ์ ์๋ ๊ณต๊ฐ์ ๊ฐ์๋ฅผ ํด๋น ์๋ฆฌ์ ์ถ๋ ฅ
2.๋ฌธ์ ํธ๋ ์๋ฆฌ
์ฒ์์ ๋ฒฝ ํ๋ํ๋ ๋ง๋ค, ๊ทธ ์๋ฆฌ๋ฅผ ๋ถ์๊ณ , bfs๋ฅผ ๋๋ ธ๋ค. ์ด๋ ๊ฒ ํ์๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์์ ๋ค๋ฅธ ์ฌ๋์ด ํผ ์๋ฆฌ๋ฅผ ์ฝ์๋ค. ๋ด๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ ์ด์ ๋, ๋ชจ๋ 1์์ bfs๋ฅผ ๋๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์๋, ๋ฏธ๋ฆฌ 0์ด ์ฐ์๋ ๊ณต๊ฐ์ ๊ฐ์์ ํด๋น ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ธ์ด์ hashMap์ ์ ์ฅํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๊ทธ๋ํ 1์ธ ๋ถ๋ถ์์ 4๋ฐฉ ํ์๋ง ํด์, 0๊ตฐ์ง ์ค ์ด๋ ๊ฒ๊ณผ ๋ง๋๋์ง ํ์ธํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ฒฝ ๋ถ๋ถ์์ 4๋ฐฉ ํ์ํด์ ์ด๋ค 0์ ๊ตฐ์ง๊ณผ ๋ง๋๋์ง๋ง ํ์ธํ๋ฉด, ๊ทธ ๊ตฐ์ง์ ๋ฐฉ์ ๊ฐ์๋ฅผ ๋ํด์ ํด๋น ๋ฒฝ์์ ๊ฐ ์ ์๋ ๊ณต๊ฐ์ ๊ตฌํ ์ ์๋ค. ์ฃผ์ํ ์ ์ 4๋ฐฉ ํ์์ ํ ๋, ํด๋น ๊ตฐ์ง์ ๋ฐฉ๋ฌธ ํ๋์ง ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํด์ผํ๋ค๋ ๊ฒ์ด๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
3. ์ฝ๋ ๋ถ์
import java.util.*;
import java.io.*;
public class Main{
// ๊ทธ๋ํ์ ๊ฐ๋ก ์ธ๋ก
static int N;
static int M;
// ๊ตฐ์งํ ๊ฒ ์ซ์ ์ธ๋ ์ฉ
static int uniNum = 2;
static int [][] graph;
static int [][] union;
// <0๊ตฐ์ง์ ๋ฒํธ, 0๊ตฐ์ง ๋ด์ ๊ฐ์>
static HashMap<Integer, Integer> map = new HashMap<>();
// ์ด ์ ๋์จ ์งํฉ ํ์ธ ์ฉ
static BitSet bit;
static int [] idx = {-1,0,1,0};
static int [] idy = {0,1,0,-1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// ์
๋ ฅ ๊ฐ ๋ฃ๊ธฐ ---------------------------------------------------
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new int[N][M];
union = new int[N][M];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < M; j++) {
graph[i][j] = Character.getNumericValue(s.charAt(j));
}
}
// ์ ๋์จ ๊ตฐ์ง ์ฐพ๊ธฐ
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// ์ ๊ทธ๋ํ์์ ํด๋น ๋ถ๋ถ์ด 0์ด๊ณ , 0๊ตฐ์ง ์ธ๋ ๊ณณ์์๋ ์์ง ์ฒดํฌ๊ฐ ์๋์๋ค๋ฉด
if(graph[i][j] == 0 && union[i][j] == 0){
zeroBfs(i,j);
}
}
}
// System.out.println(map);
//
StringBuilder sb = new StringBuilder();
// ์ด์ 1์ธ ์ง์ ์์ ์ฌ๋ฐฉ ํ์ํด์ ์ ๋์จ ๋ช ๊ฐ์ธ์ง๋ง ์ธ๋ฉด ๋๋ค.
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(graph[i][j] == 1){
sb.append(check4(i,j));
}
else{
sb.append(0);
}
}
sb.append("\n");
}
System.out.println(sb);
}
// BFS 0 ๊ตฐ์ง์ฉ -> ์ ๊ทธ๋ํ์์ 0์ด ์๋ ์ง์ ํ์ธ -> ๊ฑฐ๊ธฐ์ ๊ตฐ์ง๋ถ๋ถ์ ์ ๋ถ ์ซ์๋ก ๋ฐ๊ฟ.
static void zeroBfs (int x, int y) {
ArrayDeque<Coordinate127> aq1 = new ArrayDeque<>();
aq1.add(new Coordinate127(x,y));
union[x][y] = uniNum;
int cnt = 0;
while(!aq1.isEmpty()){
int Qsize = aq1.size();
for (int i = 0; i < Qsize; i++) {
Coordinate127 now = aq1.poll();
for (int j = 0; j < 4; j++) {
int nx = now.x + idx[j];
int ny = now.y + idy[j];
if(nx >= 0 && ny >= 0 && nx < N && ny < M){
if(union[nx][ny] == 0 && graph[nx][ny] == 0){
union[nx][ny] = uniNum;
aq1.add(new Coordinate127(nx,ny));
}
}
}
cnt++;
}
}
map.put(uniNum, cnt);
uniNum++;
}
static int check4 (int x, int y) {
int ans = 1;
bit = new BitSet(uniNum);
for (int i = 0; i < 4; i++) {
int nx = x + idx[i];
int ny = y + idy[i];
if(nx >= 0 && ny >=0 && nx < N && ny < M){
int nowUnion = union[nx][ny];
if(nowUnion == 0) continue;
// ๋ง์ฝ ํ์ฌ ์กฐํ์ค์ธ 0 ๊ตฐ์ง์ ์์ง ํ์ธํ์ง ์์ ์ํ๋ผ๋ฉด,
if(!bit.get(nowUnion)){
bit.set(nowUnion, true);
ans += map.get(nowUnion);
}
}
}
return ans%10;
}
}
class Coordinate127 {
int x;
int y;
public Coordinate127(int x, int y){
this.x = x;
this.y = y;
}
}