1+ import java .io .BufferedReader ;
2+ import java .io .InputStreamReader ;
3+ import java .util .ArrayDeque ;
4+ import java .util .ArrayList ;
5+ import java .util .Deque ;
6+ import java .util .StringTokenizer ;
7+
8+ public class Main {
9+
10+ static int n , l , r ;
11+ static int [][] toast ; // ๊ณ๋์ ์์ ์ ์ฅํ ๋ฐฐ์ด
12+ static boolean [][] visited ; // ๋ถ๋ฆฌ ๊ฐ๋ฅํ ์ง๋ฅผ ํ์ธํ ๋ฐฐ์ด
13+
14+ static int [] dy = { 1 , 0 , -1 , 0 };
15+ static int [] dx = { 0 , 1 , 0 , -1 };
16+
17+ public static void main (String [] args ) throws Exception {
18+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
19+ StringTokenizer st = new StringTokenizer (br .readLine ());
20+ n = Integer .parseInt (st .nextToken ());
21+ l = Integer .parseInt (st .nextToken ());
22+ r = Integer .parseInt (st .nextToken ());
23+ toast = new int [n ][n ];
24+ for (int i = 0 ; i < n ; i ++) {
25+ st = new StringTokenizer (br .readLine ());
26+ for (int j = 0 ; j < n ; j ++)
27+ toast [i ][j ] = Integer .parseInt (st .nextToken ());
28+ }
29+ int time = 0 ; // ๊ณ๋์ ์ด๋ ์๊ฐ
30+ while (separate ()) { // ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฐ?
31+ time ++; // ๋ถ๋ฆฌ ํ๋ค๋ฉด ๊ณ๋์ ์ด๋ ์๊ฐ ์ฆ๊ฐ
32+ }
33+ System .out .println (time );
34+ }
35+
36+ // ์์ฐจ์ ์ผ๋ก ๊ณ๋ํ์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์ง ํ์ธํ๋ ํจ์
37+ private static boolean separate () {
38+ visited = new boolean [n ][n ];
39+ boolean flg = false ; // ๋ถ๋ฆฌ๊ฐ ๋๋ ์ง๋ฅผ ์๋ ค์ค ๊ฒ์ถ Flag
40+ for (int i = 0 ; i < n ; i ++)
41+ for (int j = 0 ; j < n ; j ++) {
42+ if (visited [i ][j ]) // ์ด๋ฏธ ๋ถ๋ฆฌํ(๋ฐฉ๋ฌธํ) ๊ณ๋ ํ์ ์คํต
43+ continue ;
44+ // ์์ฐจ์ ์ผ๋ก ์ํํ๊ธฐ ๋๋ฌธ์ ์งํ ๋ฐฉํฅ์ธ ์๋, ์ค๋ฅธ์ชฝ๋ง ํ์ธ
45+ for (int k = 0 ; k < 2 ; k ++) {
46+ int ni = i + dy [k ];
47+ int nj = j + dx [k ];
48+ // ๋ค์ ์ขํ์ ํฉ์น ์ ์๋ ์ง
49+ if (isPossible (i , j , ni , nj )) {
50+ flg = true ; // ํฉ์น ์ ์์์
51+ distribute (ni , nj ); // BFS๋ฅผ ์ด์ฉํด์ ํฉ์น ์ ์๋ ๊ณ๋๋ค ํฉ์น๊ธฐ
52+ }
53+ }
54+ }
55+ return flg ; // ๊ฒ์ถ Flag ๋ฐํ
56+ }
57+
58+ // ๊ณ๋ํ์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ๊ณ๋ ํฉ์น๊ธฐ
59+ // BFS ์ด์ฉ
60+ private static void distribute (int sy , int sx ) {
61+ int cnt = 0 , sum = 0 ;
62+ // BFS
63+ Deque <int []> dq = new ArrayDeque <>();
64+ ArrayList <int []> info = new ArrayList <>(); // BFS๋ฅผ ์งํํ ์ขํ๋ค ์ ์ฅ
65+ dq .offer (new int [] { sy , sx });
66+ visited [sy ][sx ] = true ;
67+ while (!dq .isEmpty ()) {
68+ int [] cur = dq .poll ();
69+ int y = cur [0 ], x = cur [1 ];
70+ // ์ ๋ณด ์ ์ฅ
71+ cnt ++;
72+ sum += toast [y ][x ];
73+ info .add (new int [] { y , x });
74+
75+ for (int i = 0 ; i < 4 ; i ++) {
76+ int ny = cur [0 ] + dy [i ];
77+ int nx = cur [1 ] + dx [i ];
78+ // ๋ค์ ์ขํ๋ ํฉ์น ์ ์๋ ์ง
79+ if (isPossible (y , x , ny , nx )) {
80+ visited [ny ][nx ] = true ; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
81+ dq .offer (new int [] { ny , nx });
82+ }
83+ }
84+ }
85+ int avg = sum / cnt ;
86+ // ๋ฐฉ๋ฌธํ๋ ์ขํ๋ค ๊ฐ ์ฌํ ๋น
87+ for (int i = 0 ; i < info .size (); i ++) {
88+ int y = info .get (i )[0 ], x = info .get (i )[1 ];
89+ toast [y ][x ] = avg ;
90+ }
91+ }
92+
93+ // ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์ง ํ์ธํ๋ ํจ์
94+ private static boolean isPossible (int y , int x , int ny , int nx ) {
95+ // ๋ฐฉ๋ฌธํ์ง ์์๋ ์ขํ๋ค ์ค
96+ if (isValid (ny , nx ) && !visited [ny ][nx ]) {
97+ // ์ฐจ์ด๊ฐ l์ด์ r์ดํ
98+ int diff = Math .abs (toast [y ][x ] - toast [ny ][nx ]);
99+ return l <= diff && diff <= r ;
100+ }
101+ return false ;
102+ }
103+
104+ // ๊ฒฝ๊ณ ์ฒดํฌ
105+ private static boolean isValid (int y , int x ) {
106+ return 0 <= y && y < n && 0 <= x && x < n ;
107+ }
108+ }
0 commit comments