티스토리 뷰

알고리즘/Java

[백준] 16234 인구이동

세진짱 2020. 4. 24. 01:10

 

숫자 제한들이 아주 작아서 그냥 제한 생각안하고 돌려도 잘 풀리는 문제다!

 

일단 인구이동을 어떻게 시킬지 생각해보자

간단하게 DFS를 이용하면 된다

 

나와 인접한 마을중 인구수 차이가 L이상 R 이하라면 그곳의 인구를 더해주고 체크해주자

이렇게 내가 갈 수 있는 마을의 모든 인구를 더하고 순서를 order에 담아 기억해주자

 

그럼 dfs가 끝나고 인구의 총 합 / 탐색한 마을로

order를 통해 사이좋게 나눠가지면 된다

 

이걸 언제까지해야할까

그냥 이동 할 일이 없을때까지 해보자!

 

이동이 없을 조건은 나 자신만 탐색하고 끝나는 경우다

그걸 cnt의 수가 1이하라면 안하는걸로 했다!

 

쉽게 생각하고 생각없이 짜면 잘 풀린다..!

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.Scanner;
 
public class Main {
    public static int n,l,r;
    public static int[][] arr;
    public static boolean[][] check;
    public static int cnt,sum;
    public static int[] order;
    public static int[] dx = {0,0,-1,1};
    public static int[] dy = {1,-1,0,0};
    public static boolean inner(int x,int y) {
        return (0<= x && x<&& 0<=&& y<n);
    }
    public static void dfs(int x,int y) {
        check[x][y]=true;
        order[cnt++]=x*n+y;
        sum+=arr[x][y];
        for(int i=0;i<4;i++) {
            int nx = x+dx[i];
            int ny = y+dy[i];
            if(inner(nx,ny) && !check[nx][ny]) {
                int diff = Math.abs(arr[x][y]-arr[nx][ny]);
                if(l<=diff && diff<=r) dfs(nx,ny);
            }
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        l = sc.nextInt();
        r = sc.nextInt();
        arr = new int[n+1][n+1];
        check = new boolean[n+1][n+1];
        order = new int[n*n+5];
        
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                arr[i][j]=sc.nextInt();
            }
        }
        int ans=0;
        while(true) {
            boolean used=false;
            for(int i=0;i<n;i++) {
                for(int j=0;j<n;j++) {
                    if(!check[i][j]) {
                        sum=0; cnt=0;
                        dfs(i,j);
                        if(cnt<=1continue;
                        used=true;
                        sum/=cnt;
                        for(int k=0;k<cnt;k++) {
                            int x = order[k]/n;
                            int y = order[k]%n;
                            arr[x][y]=sum;
                        }
                    }
                }
            }
            if(!used) break;
            for(int i=0;i<n;i++) {
                for(int j=0;j<n;j++) {
                    check[i][j]=false;
                }
            }
            ans++;
        }
        System.out.println(ans);
    }
}
 
 
 

'알고리즘 > Java' 카테고리의 다른 글

[백준] 6987 월드컵  (0) 2020.05.07
[SWEA] 4050 재관이의 대량 할인  (0) 2020.04.29
[SWEA] 9659 다항식 계산  (0) 2020.04.03
[SWEA] 1244 최대상금  (0) 2020.02.17
[JUNGOL] 1828 냉장고  (0) 2020.02.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함