BOJ_G5_16234
๐ [G5_16234] ์ธ๊ตฌ์ด๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N, L, R;
static int[][] map;
static boolean[][] v;
// 4๋ฐฉํฅ ํ์ : ์ค, ๋ฐ, ์ผ, ์
static int[] dx = { 1, 0, -1, 0 };
static int[] dy = { 0, 1, 0, -1 };
// ์ธ๊ตฌ์ด๋์ด ํ์ํ ๋
ธ๋ ๋ฆฌ์คํธ
static ArrayList<Node> list;
public static class Node{
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// **** input start ****
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
// map ๋ฐฐ์ด
map = new int[N][N];
// ๋ฐฐ์ด ์
๋ ฅ
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// **** input end ****
// output
System.out.println(move());
}
// ๊ฐ ์ด๋ํ๊ธฐ
public static int move() {
int res = 0;
while(true) {
// ์ธ๊ตฌ์ด๋์ ๋ํ๋ด๋ ๋ณ์
boolean isMove = false;
v = new boolean[N][N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด ํต๊ณผ
if(v[i][j]) continue;
int sum = bfs(i,j);
// list๊ฐ 1๋ณด๋ค ํฌ๋ค๋ฉด ์ธ๊ตฌ์ด๋
if(list.size() > 1) {
change(sum);
isMove = true;
}
}
}
// ์ธ๊ตฌ์ด๋์ด ๋์ด์ ์์ผ๋ฉด ๋
if(!isMove) return res;
res++;
}
}
// bfs
public static int bfs(int x, int y) {
Queue<Node> queue = new LinkedList<>();
list = new ArrayList<>();
// ํ์ ์
๋ ฅ
queue.offer(new Node(x, y));
// ๋ฆฌ์คํธ์ ์
๋ ฅ
list.add(new Node(x, y));
// ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
v[x][y] = true;
int sum = map[x][y];
while(!queue.isEmpty()) {
// ํ์ฌ ๋
ธ๋ ์ ์ฅ
Node current = queue.poll();
// 4๋ฐฉํฅ ํ์
int ny,nx;
for(int i=0; i<4; i++) {
nx = current.x + dx[i];
ny = current.y + dy[i];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด ํต๊ณผ
if(nx < 0 || ny < 0 || nx > N-1 || ny > N-1 || v[nx][ny]) continue;
// ์ธ๊ตฌ์ ์ฐจ์ด ์ฒดํฌ
int temp = Math.abs(map[current.x][current.y] - map[nx][ny]);
// ์กฐ๊ฑด์ ๋ถํฉํ๋ฉด
if(temp >= L && temp <= R) {
// ์
๋ ฅํ๊ธฐ
queue.offer(new Node(nx,ny));
list.add(new Node(nx,ny));
// ๊ฐ ๋ํด์ฃผ๊ธฐ
sum += map[nx][ny];
// ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
v[nx][ny] = true;
}
}
}
return sum;
}
// ์ธ๊ตฌ ์ด๋
public static void change(int sum) {
int avg = sum / list.size();
for(Node n : list) {
map[n.x][n.y] = avg;
}
}
}
๐ค ๋์ ์๊ฐ
์ฒ์์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์ ์ฒด ์ขํ๋ฅผ ๋๋ฉด์ dfs์ 4๋ฐฉํฅ ํ์์ ํตํด ์ฐ๊ฒฐ์กฐ๊ฑด์ด ๋๋ ๊ฒ๋ค์ ๋ํ๊ณ ํ๊ท ์ ๊ตฌํด์ค ๋ค ๊ทธ ๊ฐ๋ค์ ๋ค๋ฅธ ๋ฐฐ์ด์ ์ ์ฅํด์ฃผ์.
๊ทธ๋ฆฌ๊ณ ์ ์ฒด๋ฅผ ํ ๋ฒ ๋ค๋๊ณ ๊ทธ ๋ค๋ฅธ ๋ฐฐ์ด์ ์๋ map์ผ๋ก copyํ์ ๋ผ๊ณ ์๊ฐ์ ํ๋ค.
์ด ๊ณผ์ ๋ค์ ๋ฐ๋ณตํ ๊ฒฐ๊ณผ ์ ๊ณต๋ tc๋ ๋ค ๋ง์๋๋ฐ ์จ๊ฒจ์ง tc์์ ํ๋ฆฐ ๊ฒ์ด๋ค.
์๊ฐ์ ํด๋ณด๋ ๊ธฐ์กด ์ ์ฒด ์ขํ์์ ํ๋์ ์ฐ๊ฒฐ๊ทธ๋ฃน๋ง ์์ผ๋ฉด ๋ง๋๋ฐ ์ฌ๋ฌ๊ฐ์ ์ฐ๊ฒฐ ๊ทธ๋ฃน์ด ๋์ฌ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ด์๋ค.
๊ทธ๋์ ๋์์ ๋ฐ์ ์๋ก ์ ๊ทผํด ๋ณด์๋ค.
- ์ ์ฒด ๋ฐฐ์ด์ ๋๋ฉฐ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ ๋ฐฉ๋ฌธํ๋ค. ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ฐ๋ณต
- BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ list์ ๋ฃ์ด์ฃผ๊ณ ํฉ๋ค์ ์ ์ฅํ๋ค.
- ์ ์ฒด ๋ฐฐ์ด์ ๋ค ๋์์ผ๋ฉด ๋ ธ๋๋ค์ ์ธ๊ตฌ์ด๋์ ์์ํ๋ค. ( list์ ํฌ๊ธฐ๊ฐ 1๋ณด๋ค ์ปค์ผ ์คํ - ์ฐ๊ฒฐ๋ ๊ฒ๋ค์ด ์กด์ฌํ๋ค๋ ๋ป )
- ์ธ๊ตฌ ์ด๋ ์ฝ๋์์ ํฉ๋ค์ list ์ฌ์ด์ฆ๋ก ๋๋ ์ ๋ชจ๋ ๋ ธ๋์ ๊ฐ์ ๋ณ๊ฒฝ์ํจ๋ค.
- ์์ ๊ณผ์ ๋ค์ ๋ฐ๋ณตํด์ ์ด ๋ฐ๋ณตํ์๋ฅผ ๊ตฌํด์ค๋ค.