2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [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 ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆ ์„œ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.
  • ์œ„์˜ ๊ณผ์ •๋“ค์„ ๋ฐ˜๋ณตํ•ด์„œ ์ด ๋ฐ˜๋ณตํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

ํƒœ๊ทธ: , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: