Skip to content

Commit 0db7d67

Browse files
authored
[백준 17779] 게리맨더링 2 - 시뮬레이션
1 parent bffc1b7 commit 0db7d67

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

hoseok/week34/Boj17779.java

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
class Main {
5+
6+
private static int n;
7+
private static int[][] map;
8+
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
12+
n = Integer.parseInt(br.readLine());
13+
map = new int[n + 1][n + 1];
14+
int totalSum = 0;
15+
int minMinus = Integer.MAX_VALUE;
16+
for (int i = 1; i <= n; i++) {
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
for (int j = 1; j <= n; j++) {
19+
map[i][j] = Integer.parseInt(st.nextToken());
20+
totalSum += map[i][j];
21+
}
22+
}
23+
24+
// 경계를 나누기
25+
for (int y = 1; y <= n; y++) {
26+
for (int x = 1; x <= n; x++) {
27+
for (int d1 = 1; d1 <= n - 1; d1++) {
28+
for (int d2 = 1; d2 <= n - 1; d2++) {
29+
if (!check(x, y, d1, d2)) {
30+
continue;
31+
}
32+
int max;
33+
int min;
34+
boolean[][] visited = new boolean[n + 1][n + 1];
35+
// 5구역 줄 긋기
36+
drawLine(visited, x, y, d1, d2);
37+
38+
// 1구역 합 구하기
39+
int firstSum = getFirstSection(visited, x, y, d1, d2);
40+
// 2구역 합 구하기
41+
int secondSum = getSecondSection(visited, x, y, d1, d2);
42+
// 3구역 합 구하기
43+
int thirdSum = getThirdSection(visited, x, y ,d1, d2);
44+
// 4구역 합 구하기
45+
int fourthSum = getFourthSection(visited, x, y, d1, d2);
46+
// 5구역 구하기
47+
int fifthSum = totalSum - (firstSum + secondSum + thirdSum + fourthSum);
48+
49+
// 가장 큰 값과 작은 값 차 구하고 최소값 갱신
50+
max = Math.max(firstSum, Math.max(secondSum, Math.max(thirdSum, Math.max(fourthSum, fifthSum))));
51+
min = Math.min(firstSum, Math.min(secondSum, Math.min(thirdSum, Math.min(fourthSum, fifthSum))));
52+
minMinus = Math.min(minMinus, max - min);
53+
}
54+
}
55+
}
56+
}
57+
bw.write(minMinus + "");
58+
bw.flush();
59+
bw.close();
60+
}
61+
62+
public static int getFourthSection(boolean[][] visited, int x, int y, int d1, int d2) {
63+
int sum = 0;
64+
for (int r = x + d2 + 1; r <= n; r++) {
65+
for (int c = n; c >= y - d1 + d2; c--) {
66+
if (visited[r][c]) {
67+
break;
68+
}
69+
sum += map[r][c];
70+
}
71+
}
72+
return sum;
73+
}
74+
75+
public static int getThirdSection(boolean[][] visited, int x, int y, int d1, int d2) {
76+
int sum = 0;
77+
for (int r = x + d1; r <= n; r++) {
78+
for (int c = 1; c < y - d1 + d2; c++) {
79+
if (visited[r][c]) {
80+
break;
81+
}
82+
sum += map[r][c];
83+
}
84+
}
85+
return sum;
86+
}
87+
88+
public static int getSecondSection(boolean[][] visited, int x, int y, int d1, int d2) {
89+
int sum = 0;
90+
for (int r = 1; r <= x + d2; r++) {
91+
for (int c = n; c > y; c--) {
92+
if (visited[r][c]) {
93+
break;
94+
}
95+
sum += map[r][c];
96+
}
97+
}
98+
return sum;
99+
}
100+
101+
public static int getFirstSection(boolean[][] visited, int x, int y, int d1, int d2) {
102+
int sum = 0;
103+
for (int r = 1; r < x + d1; r++) {
104+
for (int c = 1; c <= y; c++) {
105+
if (visited[r][c]) {
106+
break;
107+
}
108+
sum += map[r][c];
109+
}
110+
}
111+
return sum;
112+
}
113+
114+
public static void drawLine(boolean[][] visited, int x, int y, int d1, int d2) {
115+
// 우상 대각
116+
for (int i = 0; i <= d1; i++) {
117+
visited[x + i][y - i] = true;
118+
}
119+
// 우하 대각
120+
for (int i = 0; i <= d2; i++) {
121+
visited[x + i][y + i] = true;
122+
}
123+
// 우상 -> 우하 대각
124+
for (int i = 0; i <= d2; i++) {
125+
visited[x + d1 + i][y - d1 + i] = true;
126+
}
127+
// 우하 -> 우상 대각
128+
for (int i = 0; i <= d1; i++) {
129+
visited[x + d2 + i][y + d2 - i] = true;
130+
}
131+
}
132+
133+
public static boolean check(int x, int y, int d1, int d2) {
134+
return (x + d1 + d2 <= n)
135+
&& (1 <= y - d1)
136+
&& (y - d1 < y)
137+
&& (y < y + d2)
138+
&& (y + d2 <= n);
139+
}
140+
}

0 commit comments

Comments
 (0)