๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2๏ธโƒฃ Java/Problem Solving

[Java Algorithm] ์ธ๊ตฌ ์ด๋™ BOJ #16234

by seolhee2750 2022. 9. 22.
๋ฌธ์ œ

https://www.acmicpc.net/problem/16234

 

16234๋ฒˆ: ์ธ๊ตฌ ์ด๋™

N×Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1×1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋•…์—๋Š” ๋‚˜๋ผ๊ฐ€ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, rํ–‰ c์—ด์— ์žˆ๋Š” ๋‚˜๋ผ์—๋Š” A[r][c]๋ช…์ด ์‚ด๊ณ  ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‚˜๋ผ ์‚ฌ์ด์—๋Š” ๊ตญ๊ฒฝ์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ชจ

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {
	
	static int n, l, r;
	static int[][] map, visited;
	static int cnt, sum; // ํ˜„์žฌ ์—ฐํ•ฉ์˜ ๋‚˜๋ผ ๊ฐœ์ˆ˜, ํ˜„์žฌ ์—ฐํ•ฉ์˜ ์ด ์ธ๊ตฌ์ˆ˜
	static int teams, day; // ํ•˜๋ฃจ์— ํ•ด๋‹นํ•˜๋Š” ์—ฐํ•ฉ์˜ ๊ฐœ์ˆ˜, ๋‚ ์งœ ์นด์šดํŠธ
	static int[] dx = {0, 0, -1, 1};
	static int[] dy = {-1, 1, 0, 0};
	static Deque<int[]> que = new ArrayDeque<>();
	
	public static void bfs(int i, int j) { // ์—ฐํ•ฉ ์ฐพ๊ธฐ (์—ฐํ•ฉ์„ ์ด๋ฃจ๋Š” ๋‚˜๋ผ๋Š” visited์— 1๋กœ ํ‘œ์‹œ)
		while(!que.isEmpty()) {
			int[] now = que.removeFirst();
			int x = now[0];
			int y = now[1];
			
			for(int a = 0; a < 4; a++) {
				int nx = x + dx[a];
				int ny = y + dy[a];
				
				if(nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] != 0) continue; // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ์  ์žˆ๋Š” ๊ณณ์ผ ๋–ผ
				if(Math.abs(map[x][y] - map[nx][ny]) < l || Math.abs(map[x][y] - map[nx][ny]) > r) continue; // ์ธ๊ตฌ ์ฐจ๊ฐ€ ๊ธฐ์ค€์— ๋ฒ—์–ด๋‚  ๋•Œ
				
				visited[nx][ny] = 1;
				sum += map[nx][ny];
				cnt++;
				que.add(new int[]{nx, ny});
			}
		}
		
		visited[i][j] = -1; // ์‹œ์ž‘์  ๋ฐฉ๋ฌธ ์ฒดํฌ๋งŒ ๋‚จ๊ฒจ๋†“๊ธฐ
		if(cnt > 1) { // ์—ฐํ•ฉ์ด ์ด๋ฃจ์–ด์กŒ์„ ๋–„
			teams++; // ์—ฐํ•ฉ ํ•˜๋‚˜ ๋ฐœ๊ฒฌํ–ˆ์Œ์„ ํ‘œ์‹œ
			map[i][j] = sum /cnt; // ์‹œ์ž‘์ ๋งŒ ๋จผ์ € ์ธ๊ตฌ ์ด๋™ ์‹œ์ผœ์ฃผ๊ธฐ
			que.add(new int[]{i, j});
			update(map[i][j]);
		}
	}
	
	public static void update(int popul) { // ์ธ๊ตฌ ์ด๋™์‹œ์ผœ์ฃผ๋ฉด์„œ, ์ธ๊ตฌ ์ด๋™์„ ๋งˆ์นœ ๋‚˜๋ผ์˜ visited๋Š” -1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
		while(!que.isEmpty()) {
			int[] now = que.removeFirst();
			int x = now[0];
			int y = now[1];
			
			for(int a = 0; a < 4; a++) {
				int nx = x + dx[a];
				int ny = y + dy[a];
				
				if(nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] != 1) continue; // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ฐพ๋Š” ์—ฐํ•ฉ์ด ์•„๋‹ ๋•Œ
				
				map[nx][ny] = popul; // ์ธ๊ตฌ์ด๋™
				visited[nx][ny] = -1; // ์ธ๊ตฌ์ด๋™์„ ๋งˆ์นœ ์—ฐํ•ฉ์ž„์„ ํ‘œ์‹œ
				que.add(new int[]{nx, ny});
			}
		}
	}

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(in.readLine());
		n = Integer.parseInt(st.nextToken());
		l = Integer.parseInt(st.nextToken());
		r = Integer.parseInt(st.nextToken());
		map = new int[n][n];
		visited = new int[n][n];
		day = 0;
		
		for(int i = 0; i < n; i++) {
			st = new StringTokenizer(in.readLine());
			for(int j = 0; j < n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		while(true) { // ํ•œ ๋ฒˆ์˜ while ๋ฐ˜๋ณต == ํ•˜๋ฃจ
			teams = 0;
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < n; j++) {
					if(visited[i][j] == 0) {
						que.add(new int[]{i, j});
						cnt = 1;
						sum = map[i][j];
						visited[i][j] = 1;
						bfs(i, j);
					}
				}
			}
			if(teams == 0) { // ์—ฐํ•ฉ์ด ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ
				System.out.println(day);
				return;
			}
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < n; j++) {
					visited[i][j] = 0;
				}
			}
			
			day++;
		}
	}
}

๐Ÿ‘‰ BFS ๋ฌธ์ œ

  • visited๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์—ฐํ•ฉ์„ ์ด๋ฃจ์ง€ ์•Š์€ ๋‚˜๋ผ๋ฅผ ์ฐพ์•„์ฃผ์—ˆ๋‹ค.
    visited๋Š” intํ˜• 2์ฐจ์› ๋ฐฐ์—ด์ธ๋ฐ, 0 ํ˜น์€ 1 ํ˜น์€ -1๋งŒ ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.
    (0: ์—ฐํ•ฉ์„ ์ด๋ฃจ์ง€ ์•Š์€ ๋‚˜๋ผ / -1: ์ด๋ฏธ ์ฒดํฌํ•ด์ค€ ๋‚˜๋ผ / 1: ํ˜„์žฌ ์—ฐํ•ฉ์„ ์ด๋ฃจ๋Š” ๋‚˜๋ผ)
  • 2์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ visited๊ฐ€ 0์ธ ๋‚˜๋ผ๋ฅผ ๋งŒ๋‚˜๋ฉด, ์•„์ง ์—ฐํ•ฉ์„ ๊ตฌํ•˜์ง€ ๋ชปํ•œ ๋‚˜๋ผ์ด๋ฏ€๋กœ
    bfs ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—ฐํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฃผ๋ณ€์„ ์ฒดํฌํ•ด์ฃผ์—ˆ๋‹ค.
  • bfs์—์„œ๋Š” ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์—ฐํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„,
    ๋  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋ผ ๋ฐœ๊ฒฌ ์‹œ ์—ฐํ•ฉ์ด ๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด visited๋ฅผ 1๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค. 
    ๊ทธ๋ฆฌ๊ณ  ๊ทธ์™€ ๋™์‹œ์— sum์— ํ•ด๋‹น ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ˆ˜๋ฅผ ๋”ํ•˜๊ณ ,
    cnt ๋ณ€์ˆ˜๋ฅผ 1 ๋Š˜๋ ค์„œ ์—ฐํ•ฉ ๋‚˜๋ผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ์—ˆ๋‹ค.
  • ์œ„์™€ ๊ฐ™์€ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๋” ์ด์ƒ ์—ฐํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋ผ๊ฐ€ ์—†๋‹ค๋ฉด
    update ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์„œ ์ธ๊ตฌ ์ด๋™๊ณผ visited ํ•จ์ˆ˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.
  • update ํ•จ์ˆ˜๋Š” sum / cnt๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ ,
    bfs ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ que๋ฅผ ์ด์šฉํ•ด bfs ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.
    (์–ด์ฐจํ”ผ ๋ฐฉ๊ธˆ ํƒ์ƒ‰ํ–ˆ๋˜ ์—ฐํ•ฉ์€ ๋ชจ๋‘ ์ธ์ ‘ํ•ด์žˆ์œผ๋ฏ€๋กœ bfs๋ฅผ ์ด์šฉํ•ด ํšจ์œจ์ ์œผ๋กœ ํƒ์ƒ‰ ๊ฐ€๋Šฅ)
  • update์—์„œ๋Š” ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ ์—ฐํ•ฉ์— ํ•ด๋‹นํ•˜๋Š” ๋‚˜๋ผ๋“ค์˜ ์ธ๊ตฌ๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผฐ๊ณ ,
    ์ธ๊ตฌ ์ด๋™์„ ์™„๋ฃŒํ•œ ๋‚˜๋ผ๋Š” visited๋ฅผ -1๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด ์ด๋ฏธ ์ฒดํฌ๊ฐ€ ์™„๋ฃŒ๋œ ๋‚˜๋ผ์ž„์„ ํ‘œ์‹œํ–ˆ๋‹ค.
  • ์œ„์™€ ๊ฐ™์€ ์‹คํ–‰์„ map์˜ ๋ชจ๋“  ๋‚˜๋ผ๋ฅผ ์ฒดํฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ณ ,
    ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด teams ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์—ฐํ•ฉ์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์—ˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ–ˆ๋‹ค.
    teams ๋ณ€์ˆ˜๋Š” bfs ํ•จ์ˆ˜์—์„œ ํ•˜๋‚˜์˜ ์—ฐํ•ฉ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ++ํ•ด์ฃผ์—ˆ๋Š”๋ฐ,
    teams๋ณ€์ˆ˜๊ฐ€ 0์ด๋ผ๋ฉด ํ•œ ๊ฐœ์˜ ์—ฐํ•ฉ๋„ ์—†์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  return ํ–ˆ๋‹ค.
  • teams ๋ณ€์ˆ˜๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์—ฐํ•ฉ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ,
    ์ด๋Š” ๋‹ค์Œ ๋‚ ์˜ ์ธ๊ตฌ ์ด๋™๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ดํฌํ•˜๋ฏ€๋กœ ๋‹ค์Œ ๋ฐ˜๋ณต์„ ๋˜ ๋‹ค์‹œ ์ง„ํ–‰์‹œ์ผฐ๋‹ค.

 

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ bfs ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋Œ“๊ธ€