Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

코린이 탈출기

[백준 17779] 게리맨더링 2 본문

문제 풀이/Simulation

[백준 17779] 게리맨더링 2

명란파스타 2020. 8. 2. 18:54

문제 바로가기

 

17779번: 게리맨더링 2

재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름��

www.acmicpc.net

 

문제 미쳤냐..

x y 반대로 돼있다 ㅜㅜㅜ 하..

너무 헷갈려 !!!!

 

심지어 첫 예시가 d1 = 1, d2 = 1이여서 그냥 해보면 x, y가 바껴있다는 걸 모른다..

분명 다 맞게 했는데 왜 안되는지 엄청 헤맸는데 ㅠㅅㅠ

풀기전에 예시로 나와있는 거 다 보고 해야겠다..

어렵지는 않은데 느므 더럽다 이런문제 싫다 진짜...

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;

int N;
int people[21][21];
int map[21][21];
int population[6];
int min_diff = 100*20;
vector<pair<int, int>> base;


void find_area(int y, int x, int d1, int d2)
{
    for (int i = 0; i<= d1; i++)
    {
        map[x+i][y - i] = 5;
        map[x + d2 + i][y + d2 - i] = 5;
    }

    for (int i = 0; i <= d2; i++)
    {
        map[x + i][y + i] = 5;
        map[x + d1 + i][y - d1 + i] = 5;
    }


    for (int i = 1; i <= N; i++)
    {
        int flag = 0;
        int start = 0, end = 0;
        for (int j = 1; j <= N; j++)
        {
            if (map[i][j] == 5 && !flag)
            {
                start = j;
                flag = 1;
            }
            else if (map[i][j] == 5 && flag)
            {
                end = j;
                flag = 0;
            }

        }

        for (int j = start + 1; j < end; j++)
            map[i][j] = 5;
    }

    //1번 구역
    for (int i = 1; i < x + d1; i++)
    {
        for (int j = 1; j <= y; j++)
        {
            if (!map[i][j])
                map[i][j] = 1;
        }
    }

    //2번 구역
    for (int i = 1; i <= x + d2; i++)
    {
        for (int j = y + 1; j <= N; j++)
        {
            if (!map[i][j])
                map[i][j] = 2;
        }
    }

    //3번 구역
    for (int i = x + d1; i <= N; i++)
    {
        for (int j = 1; j < y - d1 + d2; j++)
        {
            if (!map[i][j])
                map[i][j] = 3;
        }
    }

    //4번 구역
    for (int i = x + d2 + 1; i <= N; i++)
    {
        for (int j = y- d1 + d2; j <= N; j++)
        {
            if (!map[i][j])
                map[i][j] = 4;
        }
    }
}

int find_diff()
{
    for (int k = 1; k <= 5; k++)
    {
        int pop = 0;
        for (int i = 1; i <= N; i++)
        {
            for (int j = 1; j <= N; j++)
            {
                if (map[i][j] == k)
                {
                    pop += people[i][j];
                }
            }
        }
        population[k] = pop;
    }

    sort(population + 1, population + 6);
    int res = population[5] - population[1];

    return res;
}
int main()
{
    cin >> N;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            cin >> people[i][j];
            base.push_back({i, j});
        }
    }

    for (pair<int,int> b: base) //기준점 x,y 정하기
    {
        for (int d1 = 1; d1 <= N; d1++)
        {
            for (int d2 = 1; d2 <= N; d2++)
            {
                memset(map, 0, sizeof(map));
                memset(population, 0, sizeof(population));

                if (d1 + d2 <= N - b.second && d2 <= N- b.first && d1 <= b.first -1)
                {
                    find_area(b.first, b.second, d1, d2);
                    min_diff = min(min_diff, find_diff());
                }
            }
        }

    }

    cout << min_diff << endl;
    return 0;
}

'문제 풀이 > Simulation' 카테고리의 다른 글

[백준 16235] 나무 재테크  (0) 2020.08.10
[백준 13460] 구슬 탈출 2  (0) 2020.08.05
[백준 3190] 뱀  (0) 2020.08.02
[백준 17140] 이차원 배열과 연산  (0) 2020.07.29
[백준 15684] 사다리 조작  (0) 2020.07.28