알고리즘/코드트리

토스트 계란틀

베리영young 2024. 12. 4. 09:47

빡구현

java

 

package week26;

import java.util.*;

public class Main { //코드트리_토스트 계란틀
	static int n, L, R, map[][], ans;

	public static void main(String[] args) {
		init_토계();
		
		while(true) {
			int[][] openTheDoor = bfs_토계(); //다 0이면 열 게 없음
			
			int sum = 0;
			for(int i=0; i<n; i++) {
				for(int j=0; j<n; j++) {
					sum += openTheDoor[i][j];
				}
			}
			
			if(sum == 0) break;
			
			//열려 있으면 평균내기
			flatten(openTheDoor);
			ans++;
			
		}
		
		System.out.println(ans);
	}

	private static void flatten(int[][] openTheDoor) {
		int maxNum = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				maxNum = Math.max(maxNum, openTheDoor[i][j]);
			}
		}
		
		List<int[]>[] groups = new ArrayList[maxNum];
		for (int i = 0; i < groups.length; i++) {
			groups[i] = new ArrayList<>();
		}
		
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if(openTheDoor[i][j] != 0) {
					groups[openTheDoor[i][j]-1].add(new int[] {i, j});
				}
			}
		}
		
		for (int i = 0; i < groups.length; i++) {
			int cnt = groups[i].size();
			int sum = 0;
			for (int j = 0; j < cnt; j++) {
				sum += map[groups[i].get(j)[0]][groups[i].get(j)[1]];
			}
			
			int eggs = sum / cnt;
			for (int j = 0; j < cnt; j++) {
				map[groups[i].get(j)[0]][groups[i].get(j)[1]] = eggs;
			}
		}
	}

	private static int[][] bfs_토계() {
		int[][] doors = new int[n][n];
		int num = 1; //덩어리마다 1씩 증가
		
		int[] dx = {-1,1,0,0};
		int[] dy = {0,0,-1,1};
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				for(int d=0; d<4; d++) {
					int nx = dx[d]+i;
					int ny = dy[d]+j;
					
					if(nx>=0&&nx<n && ny>=0&&ny<n) {
						if(doors[nx][ny] == 0) {
							if(L <= Math.abs(map[i][j] - map[nx][ny]) && Math.abs(map[i][j] - map[nx][ny]) <= R) {
								Queue<int[]> q = new ArrayDeque<>();
								q.add(new int[] {i,j});
								
								while(!q.isEmpty()) {
									int[] p = q.poll();
									
									for(int dd=0; dd<4; dd++) {
										int nnx = p[0] + dx[dd];
										int nny = p[1] + dy[dd];
										
										if(nnx>=0&&nnx<n && nny>=0&&nny<n && doors[nnx][nny] == 0) {
											if(L <= Math.abs(map[p[0]][p[1]] - map[nnx][nny]) && Math.abs(map[p[0]][p[1]] - map[nnx][nny]) <= R) {
												doors[nnx][nny] = num;
												q.add(new int[] {nnx, nny});
											}
										}
									}
								}
								
								num++;
							}
						}
					}
				}
			}
		}
		return doors;
	}

	private static void init_토계() {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		L = sc.nextInt(); //이동 범위 최솟값
		R = sc.nextInt(); //이동 범위 최댓값
		
		map = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				map[i][j] = sc.nextInt();
			}
		}
	}

}

 

코드가 더럽군

'알고리즘 > 코드트리' 카테고리의 다른 글

나무 타이쿤  (2) 2024.12.07
원자 충돌 -> 시간초과 *****  (1) 2024.12.07
디버깅  (0) 2024.12.07
바이러스 검사  (0) 2024.11.16