Muscardinus

게리멘더링 2 본문

알고리즘 문제/[삼성 SW 역량 테스트 기출 문제]

게리멘더링 2

Muscardinus 2020. 9. 4. 15:46
728x90

www.acmicpc.net/problem/17779

 

17779번: 게리맨더링 2

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

www.acmicpc.net

#include <iostream>
#include <algorithm>
using namespace std;

int n;
int map[21][21];
int sum;
int answer = 2147000000;

int solve(int x, int y, int d1, int d2) {
	int temp[21][21] = { 0, };
	//5번 선거구
	for (int i = 0; i <= d1; i++) temp[x + i][y - i] = 5;
	for (int i = 0; i <= d1; i++) temp[x + d2 + i][y + d2 - i]=5;
	for (int i = 0; i <= d2; i++) temp[x + i][y + i]=5;
	for (int i = 0; i <= d2; i++) temp[x + d1 + i][y - d1 + i]=5;

	//1번 선거구: 1 ≤ r < x+d1, 1 ≤ c ≤ y
	int a1 = 0;
	for (int r = 1; r < x + d1; r++) {
		for (int c = 1; c <= y; c++) {
			if (temp[r][c] == 5) break;
			a1 += map[r][c];
		}
	}
	//2번 선거구: 1 ≤ r ≤ x+d2, y < c ≤ N
	int a2 = 0;
	for (int r = 1; r <= x + d2; r++) {
		for (int c = n; c > y; c--) {
			if (temp[r][c] == 5) break;
			a2 += map[r][c];
		}
	}
	//3번 선거구: x+d1 ≤ r ≤ N, 1 ≤ c < y-d1+d2
	int a3 = 0;
	for (int r = x + d1; r <= n; r++) {
		for (int c = 1; c < y - d1 + d2; c++) {
			if (temp[r][c] == 5) break;
			a3 += map[r][c];
		}
	}
	//4번 선거구: x+d2 < r ≤ N, y-d1+d2 ≤ c ≤ N
	int a4 = 0;
	for (int r = x + d2 + 1; r <= n; r++) {
		for (int c = n; c >= y - d1 + d2; c--) {
			if (temp[r][c] == 5) break;
			a4 += map[r][c];
		}
	}
	int a5 = sum - (a1 + a2 + a3 + a4);
	int max_val = max(a1, max(a2, max(a3, max(a4, a5))));
	int min_val = min(a1, min(a2, min(a3, min(a4, a5))));
	return max_val - min_val;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin >> n;
	for (int x = 1; x <= n; x++) {
		for (int y = 1; y <= n; y++) {
			cin >> map[x][y];
			sum += map[x][y];
		}
	}

	//d1,d2>=1, 1<=x<x+d1+d2<=n, 1<=y-d1<y<y+d2<=n
	for (int x = 1; x <= n; x++) {
		for (int y = 1; y <= n; y++) {
			for (int d1 = 1; d1 <= n; d1++) {
				for (int d2 = 1; d2 <= n; d2++) {
					if (x + d1 + d2 > n) continue;
					if (y - d1 < 1) continue;
					if (y + d2 > n) continue;
					answer = min(answer, solve(x, y, d1, d2));
				}
			}
		}
	}
	cout << answer << "\n";
	return 0;
}
728x90

'알고리즘 문제 > [삼성 SW 역량 테스트 기출 문제]' 카테고리의 다른 글

원판 돌리기  (0) 2020.09.05
새로운 게임 2  (0) 2020.09.05
연구소 3  (0) 2020.09.04
이차원 배열과 연산  (0) 2020.09.03
미세먼지 안녕!  (0) 2020.09.02
Comments