본문 바로가기

알고리즘

[C] 게리맨더링 2

백준 17779번

 

별찍기 응용 느낌ㅋㅋㅋ

 

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
 
int map[25][25];
int arr[25][25];
int N,ans=1000000;
 
void printMap(){
    for(int i = 1 ; i <= N ; i++){
        for(int j = 1 ; j <= N ; j++printf("%d ",arr[i][j]);
        printf("\n");
    }
    printf("\n");
}
 
void getMinMax(){
    int sum[6= {0,};
    int min = 10000000;
    int max = 0;
    for(int i = 1; i <= N ; i++){
        for(int j = 1; j <= N ; j++){
            sum[arr[i][j]] += map[i][j];
        }
    }
    for(int i = 1 ; i <= 5 ; i++){
        if(max<sum[i]) max = sum[i];
        if(min>sum[i]) min = sum[i];
    }
    if(ans>max-min) ans = max-min;
}
 
int main(){
    scanf("%d",&N);
    for(int i = 1 ; i <= N ; i++){
        for(int j = 1 ; j <= N ; j++scanf("%d",&map[i][j]);
    }
 
    for(int d1 = 1 ; d1 <= N ; d1++){
        for(int d2 = 1 ; d2<=N ; d2++){
            for(int x = 1 ; x <= N - (d1+d2) ; x++){
                for(int y = 1+d1 ; y <= N - d2 ; y++){
 
                    // 1
                    for(int r = 1 ; r < x+d1 ; r++){
                        for(int c = 1 ; c <= y ; c++){
                            arr[r][c] = 1;
                        }
                    }
 
                    // 2
                    for(int r = 1 ; r <= x+d2 ; r++){
                        for(int c = y+1 ; c <= N ; c++){
                            arr[r][c] = 2;
                        }
                    }
 
                    // 3 
                    for(int r = x+d1 ; r <= N ; r++){
                        for(int c = 1 ; c < y-d1+d2 ; c++){
                            arr[r][c] = 3;
                        }
                    }
 
                    // 4
                    for(int r = x+d2+1 ; r<=N ; r++){
                        for(int c = y-d1+d2 ; c <= N ; c++){
                            arr[r][c] = 4;
                        }
                    }
 
                    // 5
                    for(int r = x ; r <= x+d1 ;r++){
                        for(int i = 0 ; i < r-x+1 ; i++){
                            arr[r][y-i] = 5;
                        }
                    }
 
                    for(int r = x ; r <= x+d2 ; r++){
                        for(int i = 0 ; i < r-x+1 ; i++){
                            arr[r][y+i] = 5;
                        }
                    }
 
                    for(int r = x+d1+d2 ; r >= x+d1 ; r--){
                        for(int i = 0 ; i < x+d1+d2-r+1 ; i++){
                            arr[r][y-d1+d2-i] = 5;
                        }
                    }
 
                    for(int r = x+d1+d2 ; r >= x+d2 ; r--){
                        for(int i = 0 ; i < x+d1+d2-r+1 ; i++){
                            arr[r][y-d1+d2+i] = 5;
                        }
                    }
 
 
                    // printf("%d %d %d %d\n",d1,d2,x,y);
                    // printMap();
                    getMinMax();
                }
            }
        }
    }
    printf("%d\n",ans);
}
cs

 

 

이렇게 먼저 1,2,3,4를 쉽게 칠해준 후

5만 구역에 맞춰서 다시 칠해줬다

 

5 구역 칠해주는 방법은 제일 기본 별찍기인 하나부터 시작해서 밑으로 내려갈수록 별 개수가 늘어나는 방법을 그대로 사용했다

헷갈릴것도 없고 좋았던 문제

이정도로만 코테 나오면 좋겠다..ㅎㅎ

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

[C] 컨베이어 벨트 위의 로봇  (0) 2021.03.25
[C] 사다리 조작  (0) 2021.03.25
[C] 2048 (easy)  (0) 2021.03.23
[C] 구슬 탈출2  (0) 2021.03.23
[C] 달리기  (0) 2021.02.06