반응형
SW 역량테스트 합격하기 A형 강의 오픈!! (인프런 바로가기)
https://www.codetree.ai/training-field/frequent-problems/problems/war-finish
종전 문제 풀이는 BOJ 17779 : 게리맨더링 2와 같다.
#include <stdio.h>
#define MAX (20 + 5)
int T;
int N;
int MAP[MAX][MAX];
int minAnswer;
void input()
{
scanf("%d", &N);
for (int r = 0; r <= N + 1; r++)
for (int c = 0; c <= N + 1; c++)
MAP[r][c] = -1;
for (int r = 1; r <= N; r++)
for (int c = 1; c <= N; c++)
scanf("%d", &MAP[r][c]);
}
void output(int map[MAX][MAX])
{
for (int r = 1; r <= N; r++)
{
for (int c = 1; c <= N; c++)
printf("%d ", map[r][c]);
putchar('\n');
}
putchar('\n');
}
void calculate(int sr, int sc, int d1, int d2)
{
int area[MAX][MAX] = { 0 };
int sum[6] = { 0 };
int start, end, left, right;
int min, max;
start = end = sc;
left = -1, right = 1;
for (int r = sr; r <= sr + d1 + d2; r++)
{
for (int c = start; c <= end; c++) area[r][c] = 5;
start += left;
end += right;
if (start == sc - d1) left = 1;
if (end == sc + d2) right = -1;
}
// 1
for (int r = 1; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
if (area[r][c] == 5) break;
if ((1 <= r && r < sr + d1) && (1 <= c && c <= sc)) area[r][c] = 1;
}
}
// 2
for (int r = 1; r <= N; r++)
{
for (int c = sc; c <= N; c++)
{
if (area[r][c] == 5) continue;
if ((1 <= r && r <= sr + d2) && (sc < c && c <= N)) area[r][c] = 2;
}
}
// 3
for (int r = sr; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
if (area[r][c] == 5) break;
if ((sr + d1 <= r && r <= N) && (1 <= c && c < sc - d1 + d2)) area[r][c] = 3;
}
}
// 4
for (int r = sr; r <= N; r++)
{
for (int c = 1; c <= N; c++)
{
if (area[r][c] == 5) continue;
if ((sr + d2 < r && r <= N) && (sc - d1 + d2 <= c && c <= N)) area[r][c] = 4;
}
}
for (int r = 1; r <= N; r++)
for (int c = 1; c <= N; c++)
sum[area[r][c]] += MAP[r][c];
//for debug
//for (int r = 1; r <= N; r++)
//{
// for (int c = 1; c <= N; c++)
// printf("%d ", area[r][c]);
// putchar('\n');
//}
//putchar('\n');
min = 0x7fff0000;
max = -0x7fff0000;
for (int i = 1; i <= 5; i++)
{
if (sum[i] < min) min = sum[i];
if (sum[i] > max) max = sum[i];
}
if (max - min < minAnswer) minAnswer = max - min;
}
int main(void)
{
// scanf("%d", &T);
T = 1;
for (int tc = 1; tc <= T; tc++)
{
input();
minAnswer = 0x7fff0000;
for (int r = 1; r <= N - 2; r++)
{
for (int c = 2; c <= N - 1; c++)
{
for (int d1 = 1; ; d1++)
{
if (MAP[r + d1][c - d1] == -1) break;
for (int d2 = 1; ; d2++)
{
if (MAP[r + d2][c + d2] == -1 || MAP[r + d1 + d2][c + d2 - d1] == -1) break;
calculate(r, c, d1, d2);
}
}
}
}
printf("%d\n", minAnswer);
}
return 0;
}
반응형
'알고리즘 > [ADV] 삼성 SW 역량 테스트 A형' 카테고리의 다른 글
[코드트리] 이상한 다트 게임 (삼성 SW 역량테스트 2019 하반기 오후 1번) (1) | 2024.06.08 |
---|---|
[코드트리] 이상한 윷놀이 (삼성 SW 역량테스트 2019 하반기 오전 2번) (1) | 2024.06.08 |
[코드트리] 바이러스 백신 (삼성 SW 역량테스트 2019 상반기 오후 2번) (1) | 2024.06.08 |
[코드트리] 격자 숫자 놀이 (삼성 SW 역량테스트 2019 상반기 오후 1번) (1) | 2024.06.08 |
[코드트리] 생명과학부 랩 인턴 (삼성 SW 역량테스트 2019 상반기 오전 2번) (1) | 2024.06.08 |
댓글