백준 16234 인구이동

업데이트:

인구이동

bfs를 통해서 인구차이를 확인 후 List 입력하여 인구이동을 진행함

인구 차를 절대값으로 만든다음 L과 R 사이에 있는 값인지를 확인했어야 됐는데 그냥 계산한다음 진행해서 원인 찾는데 시간이 많이 소요됨..

좀더 꼼꼼하게 확인할 필요가 있음

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class Main {

	
	public static class Contry{
		int a;
		int b;
		int total;
		
		Contry(int a, int b, int total){
			this.a = a;
			this.b = b;
			this.total = total;
		}
		
	}
	static int n,l,r,result;
	
	static int[][] city;
	static int[] x = {1,-1,0,0};
	static int[] y = {0,0,1,-1};

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		l = sc.nextInt();
		r = sc.nextInt();
		result = 0;
		city = new int[n][n];
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				city[i][j] = sc.nextInt();
			}		
		}
		boolean check = true;
		while(check) {
			boolean[][] cityCheck = new boolean[n][n];
			boolean whileChekc = false;
	
			//while 문으로 해야함 하번돌떄 한번만 체크끝에서 
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < n; j++) {
					
					// 연합 체크
					if(!cityCheck[i][j]) {
						//연합 리스트
						List<Contry> list = new ArrayList<Contry>();
						list.add(new Contry(i, j, city[i][j]));
						cityCheck[i][j] = true;
						//연합 생성
						setTeam(i, j, list, cityCheck);
						
						// 연합이 있는 경우 이동
						if(list.size() > 1) {
							whileChekc = true;
							movePopulation(list);
						} else {
							cityCheck[i][j] = false;
						}
						
					}
					
					
				}		
			}
			
			check = whileChekc;
			
			if(whileChekc) {
				result++;
			} 
		}
		
		System.out.println(result);
	}
	
	private static void setTeam(int i, int j, List<Contry> list, boolean[][] cityCheck) {

		
		for(int k = 0; k < 4; k++) {
			if(i+x[k] >= 0 && j+y[k] >= 0 && i+x[k] < n && j+y[k] < n && !cityCheck[i+x[k]][j+y[k]]) {
				int population = Math.abs(city[i][j] - city[i+x[k]][j+y[k]]);
				if(population >= l && population <= r) {
					list.add(new Contry(i+x[k], j+y[k],city[i+x[k]][j+y[k]]));
					cityCheck[i+x[k]][j+y[k]] = true; 
					setTeam(i+x[k], j+y[k], list, cityCheck);
				}
				
			}

		}
	}

	private static void movePopulation(List<Contry> list) {
		
		
		int nums = 0;
		for(int i = 0; i < list.size(); i++) {
			nums += list.get(i).total;
			
 		}
		int num = nums / list.size();
		for(int i = 0; i < list.size(); i++) {
			int a = list.get(i).a;
			int b = list.get(i).b;
			
			city[a][b] = num;
 		}
		
	}

}

댓글남기기