Skip to content

Commit 3840d59

Browse files
authored
[백준 17829] 222-풀링 - 분할정복
1 parent 3798d3c commit 3840d59

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

hoseok/week78/Boj17829.java

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// BOTTOM_UP
2+
import java.io.*;
3+
import java.util.*;
4+
5+
class Main {
6+
public static void main(String[] args) throws Exception {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
9+
int n = Integer.parseInt(br.readLine());
10+
int[][] map = new int[n][n];
11+
12+
for (int i = 0; i < n; i++) {
13+
StringTokenizer st = new StringTokenizer(br.readLine());
14+
for (int j = 0; j < n; j++) {
15+
map[i][j] = Integer.parseInt(st.nextToken());
16+
}
17+
}
18+
19+
while (n / 2 > 0) {
20+
n = n / 2;
21+
int[][] nextMap = new int[n][n];
22+
23+
for (int i = 0; i < n; i++) {
24+
for (int j = 0; j < n; j++) {
25+
nextMap[i][j] = getSecondMaxNumber(i * 2, j * 2, map);
26+
}
27+
}
28+
map = nextMap;
29+
}
30+
31+
bw.write(Integer.toString(map[0][0]));
32+
bw.flush();
33+
bw.close();
34+
}
35+
36+
public static int getSecondMaxNumber(int r, int c, int[][] map) {
37+
int maxNumber = -10000;
38+
int secondMaxNumber = -10000;
39+
for (int i = r; i < r + 2; i++) {
40+
for (int j = c; j < c + 2; j++) {
41+
if (maxNumber < map[i][j]) {
42+
secondMaxNumber = maxNumber;
43+
maxNumber = map[i][j];
44+
} else {
45+
secondMaxNumber = Math.max(secondMaxNumber, map[i][j]);
46+
}
47+
}
48+
}
49+
return secondMaxNumber;
50+
}
51+
}
52+
53+
// TOP_DOWN
54+
import java.io.*;
55+
import java.util.*;
56+
57+
class Main {
58+
59+
static final int[] ROWS = {0, 1, 1, 0};
60+
static final int[] COLS = {0, 0, 1, 1};
61+
62+
public static void main(String[] args) throws Exception {
63+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
64+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
65+
int n = Integer.parseInt(br.readLine());
66+
int[][] map = new int[n][n];
67+
68+
for (int i = 0; i < n; i++) {
69+
StringTokenizer st = new StringTokenizer(br.readLine());
70+
for (int j = 0; j < n; j++) {
71+
map[i][j] = Integer.parseInt(st.nextToken());
72+
}
73+
}
74+
75+
bw.write(Integer.toString(polling(0, 0, n, map)));
76+
bw.flush();
77+
bw.close();
78+
}
79+
80+
public static int polling(int r, int c, int n, int[][] map) {
81+
int maxNumber = -10000;
82+
int secondMaxNumber = -10000;
83+
if (n == 2) {
84+
for (int i = r; i < r + 2; i++) {
85+
for (int j = c; j < c + 2; j++) {
86+
if (maxNumber < map[i][j]) {
87+
secondMaxNumber = maxNumber;
88+
maxNumber = map[i][j];
89+
} else {
90+
secondMaxNumber = Math.max(secondMaxNumber, map[i][j]);
91+
}
92+
}
93+
}
94+
95+
return secondMaxNumber;
96+
}
97+
98+
int size = n / 2;
99+
for (int i = 0; i < 4; i++) {
100+
int nextR = r + size * ROWS[i];
101+
int nextC = c + size * COLS[i];
102+
103+
int number = polling(nextR, nextC, size, map);
104+
105+
if (maxNumber < number) {
106+
secondMaxNumber = maxNumber;
107+
maxNumber = number;
108+
} else {
109+
secondMaxNumber = Math.max(secondMaxNumber, number);
110+
}
111+
}
112+
113+
return secondMaxNumber;
114+
}
115+
}

0 commit comments

Comments
 (0)