Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 16234๋ฒˆ : ์ธ๊ตฌ ์ด๋™

giraffe_ 2023. 9. 25. 16:38

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์— ๋‹ด์ž