https://www.acmicpc.net/problem/16234
16234๋ฒ: ์ธ๊ตฌ ์ด๋
N×Nํฌ๊ธฐ์ ๋ ์ด ์๊ณ , ๋ ์ 1×1๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ๋ ์๋ ๋๋ผ๊ฐ ํ๋์ฉ ์กด์ฌํ๋ฉฐ, rํ c์ด์ ์๋ ๋๋ผ์๋ A[r][c]๋ช ์ด ์ด๊ณ ์๋ค. ์ธ์ ํ ๋๋ผ ์ฌ์ด์๋ ๊ตญ๊ฒฝ์ ์ด ์กด์ฌํ๋ค. ๋ชจ
www.acmicpc.net
๋ฌธ์ 
- ๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ๊ตฌํ๊ธฐ
- ์ธ๊ตฌ ์ด๋์ ํ๋ฃจ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์งํ, ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์
- ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ์ธ์ ํ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ L๋ช ์ด์, R๋ช ์ดํ๋ผ๋ฉด, ๋ ๋๋ผ๊ฐ ๊ณต์ ํ๋ ๊ตญ๊ฒฝ์ ์ ์ค๋ ํ๋ฃจ ๋์ ์ฐ๋ค.
- ์ด๋ํ ์ ์์ผ๋ฉด, ๊ทธ ๋๋ผ๋ฅผ ์ค๋ ํ๋ฃจ ๋์์ ์ฐํฉ์ด๋ผ๊ณ ํ๋ค. ์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์นธ์ ์ธ๊ตฌ์๋ (์ฐํฉ์ ์ธ๊ตฌ์) / (์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ์นธ์ ๊ฐ์)๊ฐ ๋๋ค. ํธ์์ ์์์ ์ ๋ฒ๋ฆฐ๋ค.
- ์ฐํฉ์ ํด์ฒดํ๊ณ , ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
 
ํ์ด
์ธ๊ตฌ ์ด๋์ด ์ธ์ ํ ๋๋ผ ๊ฐ ์ด๋ฃจ์ด์ง๊ณ , ์๋ก ์ด๋ํ ์ ์๋ ๋๋ผ๋ค์ด ์ฐํฉ์ ์ด๋ฃจ๋ฏ๋ก ๊ทธ๋ํ ํ์ ์ ํ์ ๋ฌธ์ ์ด๊ณ , ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ๊ตฌํ ๋๊น์ง ๋ฐ๋ณตํด์ผ ํ๋ฏ๋ก ์๋ฎฌ๋ ์ด์  ์ ํ์ ๋ฌธ์ ์ด๋ค.
- ์๋ฎฌ๋ ์ด์ 
while๋ฌธ์ ํ์ฉํด ๊ณ์ ๋ฐ๋ณตํด์ค๋ค. ์ธ๊ตฌ ์ด๋์ด ๋ฐ์ํ๋์ง๋ฅผ ํ์ํ๋ moved๋ผ๋ booleanํ์ ๋ณ์๋ฅผ ๋๊ณ , ์ธ๊ตฌ ์ด๋์ ๊ตฌํํ๋ฉด์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณํ์ํจ๋ค. ์ธ๊ตฌ ์ด๋์ด ๋๋ฌ์ ๋, moved๊ฐ false๋ฉด(์ธ๊ตฌ ์ด๋์ด ์์์ผ๋ฉด) while๋ฌธ์ ์ข ๋ฃ์ํค๊ณ , ์๋๋ฉด ๋ ์ง๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
int day = 0;
while(true) {
	boolean moved = false; //์ธ๊ตฌ ์ด๋ ์๋์ง
	
    //์ธ๊ตฌ ์ด๋(๊ตฌํํด์ผ ํจ)
			
	if(!moved) break; //์ธ๊ตฌ์ด๋ ์์์ผ๋ฉด ์ค๋จ
			
	day++;
}
- BFS ํ์ : ์ฐํฉ๊ตญ ๊ตฌํ๊ธฐ
๊ตญ๊ฒฝ์ ์ด ์ด๋ฆฌ๋ ์ธ์ ํ ๋๋ผ๋ค๋ผ๋ฆฌ ์ฐํฉ์ ํ์ฑํ๋ฏ๋ก, ๊ทธ๋ํ ํ์ ์ค ํ๋์ธ BFS(๋๋น์ฐ์ ํ์)์ผ๋ก ๊ฐ์ ์ฐํฉ ์ฐพ๋๋ก ํ๋ค. ๊ทธ๋ํ์ ๋ชจ๋ ์ขํ์ ๋ํด ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด, ๊ทธ ์ขํ๋ฅผ ์์์ผ๋ก BFS๋ฅผ ๋๋ฆฐ๋ค. BFS ์์์๋ ํ๋ฅผ ํ์ฉํด์ ์ฌ๋ฐฉํ์์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ์์ ํฉ์ ๊ณ์ฐํด์ค๋ค.
(while๋ฌธ ์์)
visited = new boolean[N][N];
			
for(int i = 0; i < N; i++) {
	for(int j = 0; j < N; j++) {
		if(!visited[i][j]) bfs(i, j);
	}
}
- ์ฐํฉ ๋ด ์ธ๊ตฌ ์ด๋
์ฐํฉ ๋ด ์ธ๊ตฌ ์ด๋์ ์ํด์๋ ์ด๋ค ์ขํ์ ์๋ ๋๋ผ๊ฐ ์ธ๊ตฌ ์ด๋์ ํ๋์ง์ ์ฐํฉ ๋ด ์ด ์ธ๊ตฌ์๋ฅผ ์์์ผ ํ๋ค.
- ๋ฐฉ๋ฒ 1 : boolean[][]๋ก ์ฒดํฌ
์ฒ์ ์๊ฐ๋ ๋ฐฉ๋ฒ์ BFS ๋ด๋ถ์ ๋ฐ๋ก booleanํ์ 2์ฐจ์ ๋ฐฐ์ด์ ๋์ด, ํ์ํ๋ฉด์ ํ์ ๋ฃ๊ฒ ๋๋ ์ขํ๋ค์ true๋ก ํ์ํ๋ ๊ฒ์ด๋ค. BFS ํ์์ด ๋๋๊ณ ๋๋ฉด ๊ฐ์ ์ฐํฉ์ธ ๊ตญ๊ฐ๋ค์ด ํ์๊ฐ ๋ ๊ฒ์ด๊ณ , for๋ฌธ์ ๋๋ ค ๋ชจ๋ ์ขํ์ ๋ํด ํ์ํด true์ธ ๊ตญ๊ฐ์ ๋ํด ๊ณ์ฐํ ์๋ก์ด ์ธ๊ตฌ์๋ก ๋ฐ๊ฟ์คฌ๋ค.
๊ทธ๋ฌ๋, ์ฑ์ ์ ๋๋ฆฌ๋ฉด 80%์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค!

๊ฒ์ํ์ ๋ณด๋ ๋์ฒ๋ผ 80%์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ฌ๋๋ค์ด ๊ฝค ์์๊ณ , ์์ธ์ ์์๋ณด๋ ์๊ฐ๋ณต์ก๋๊ฐ O(day * N^4)์ผ๋ก, N์ด ์ต๋ 50์ด๊ณ ์ธ๊ตฌ ์ด๋์ด ์ต๋ 2000๋ฒ์ด ์ผ์ด๋ ์ ์๋ค๊ณ ํ๋, ์ต์ ์ ๊ฒฝ์ฐ 2000*50^4 = 125์ต์ด๋ค..
- ๋ฐฉ๋ฒ 2 : ArrayList์ ๋ด๊ธฐ
booleanํ์ 2์ฐจ์ ๋ฐฐ์ด์ ํ์ํ๋ ๋ฐ, N^2์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ๋ฐ๊ฟ์ผ ํ๋ค. ArrayList๋ฅผ ํ์ฉํด ํ์ํ ๊ตญ๊ฐ์ ์ขํ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ BFS ํ์์ด ๋๋๊ณ , ๋ฆฌ์คํธ์ ๋ด๊ธด ๋ชจ๋ ์ขํ์ ๋ํด ๊ณ์ฐ๋ ์๋ก์ด ์ธ๊ตฌ์๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
	static int N, L, R;
	static int[][] graph;
	static boolean[][] visited;
	
	static List<int[]> list;
	static int sum;
	
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 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());
		L = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		
		graph = new int[N][N];
		
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			
			for(int j = 0; j < N; j++) {
				graph[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		//๊ตฌํ
		int day = 0; //์ ๋ต : ๋ฉฐ์น ๋์ ์ธ๊ตฌ์ด๋ ๋ฐ์
		while(true) {
			visited = new boolean[N][N]; //bfs ํ์์ ์ํ ๋ฐฉ๋ฌธ์ฒดํฌ
			
			boolean moved = false; //์ธ๊ตฌ ์ด๋ ์๋์ง
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < N; j++) {
					if(!visited[i][j]) {
						list = new ArrayList<>(); //์ฐํฉ
						sum = 0; //์ฐํฉ๊ตญ ์ธ๊ตฌ ํฉ
						
						bfs(i, j);
						
						//์ธ๊ตฌ ์ด๋
						if(list.size() >= 2) {
							int population = sum / list.size(); //์ฐํฉ๊ตญ ์ ์ธ๊ตฌ์
							
							for(int[] point : list) {
								graph[point[0]][point[1]] = population;
							}
							
							moved = true;
						} 
					}
				}
			}
			
			if(!moved) break; //์ธ๊ตฌ์ด๋ ์์์ผ๋ฉด ์ค๋จ
			
			day++;
		}
		
		//์ถ๋ ฅ
		System.out.println(day);
	}
	
	public static void bfs(int i, int j) {
		Queue<int[]> queue = new LinkedList<>();
		
		queue.add(new int[] {i, j});
		visited[i][j] = true;
		list.add(new int[] {i,j});
		
		sum += graph[i][j];
		
		while(!queue.isEmpty()) {
			int x = queue.peek()[0];
			int y = queue.poll()[1];
			
			for(int d = 0; d < 4; d++) {
				int nx = x + dx[d];
				int ny = y + dy[d];
				
				if(0 > nx || nx >= N || 0 > ny || ny >= N) continue; //๋ฒ์ ๋ฒ์ด๋จ
				if(visited[nx][ny]) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธํจ
				
				//์กฐ๊ฑด ํ์
				int diff = Math.abs(graph[x][y] - graph[nx][ny]);
				
				if(L <= diff && diff <= R ) { //๊ตญ๊ฒฝ์  ์ด๊ธฐ ๊ฐ๋ฅ
					queue.add(new int[] {nx, ny});
					visited[nx][ny] = true;
					list.add(new int[] {nx,ny});
					
					sum += graph[nx][ny];
				}
			}
		}
	}
}
๊ฒฐ๊ณผ

๋ฐฐ์ด์ 
- n^2 bfs ๋ด, n^2๊ฐ ๋ค์ด๊ฐ์ง ์๊ฒ ์กฐ์ฌํ์
- 2์ฐจ์ ๋ฐฐ์ด์ ์ฒดํฌ๋์ list์ ๋ด์
 
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐฑ์ค 20922๋ฒ : ๊ฒน์น๋ ๊ฑด ์ซ์ด (0) | 2024.01.09 | 
|---|---|
| ๋ฐฑ์ค 1253๋ฒ : ์ข๋ค (0) | 2024.01.09 | 
| ๋ฐฑ์ค 1261๋ฒ : ์๊ณ ์คํ (0) | 2023.09.16 | 
| ๋ฐฑ์ค 7785๋ฒ : ํ์ฌ์ ์๋ ์ฌ๋ (0) | 2023.08.30 | 
| ๋ฐฑ์ค 14442๋ฒ : ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ2 (0) | 2023.08.30 | 
