๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2630
2630๋ฒ: ์์ข ์ด ๋ง๋ค๊ธฐ
์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ข ์ด์ ํ ๋ณ์ ๊ธธ์ด N์ด ์ฃผ์ด์ ธ ์๋ค. N์ 2, 4, 8, 16, 32, 64, 128 ์ค ํ๋์ด๋ค. ์์ข ์ด์ ๊ฐ ๊ฐ๋ก์ค์ ์ ์ฌ๊ฐํ์นธ๋ค์ ์์ด ์์ค๋ถํฐ ์ฐจ๋ก๋ก ๋์งธ ์ค๋ถํฐ ๋ง์ง๋ง ์ค๊น์ง ์ฃผ์ด์ง๋ค.
www.acmicpc.net
โธ ๋ฌธ์
์๋ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ์ ์ฌ๊ฐํ์นธ๋ค๋ก ์ด๋ฃจ์ด์ง ์ ์ฌ๊ฐํ ๋ชจ์์ ์ข ์ด๊ฐ ์ฃผ์ด์ ธ ์๊ณ , ๊ฐ ์ ์ฌ๊ฐํ๋ค์ ํ์์์ผ๋ก ์น ํด์ ธ ์๊ฑฐ๋ ํ๋์์ผ๋ก ์น ํด์ ธ ์๋ค. ์ฃผ์ด์ง ์ข ์ด๋ฅผ ์ผ์ ํ ๊ท์น์ ๋ฐ๋ผ ์๋ผ์ ๋ค์ํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์ฌ๊ฐํ ๋ชจ์์ ํ์์ ๋๋ ํ๋์ ์์ข ์ด๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
์ ์ฒด ์ข ์ด์ ํฌ๊ธฐ๊ฐ N×N(N=2k, k๋ 1 ์ด์ 7 ์ดํ์ ์์ฐ์) ์ด๋ผ๋ฉด ์ข ์ด๋ฅผ ์๋ฅด๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ข ์ด๊ฐ ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ ์์ง ์์ผ๋ฉด ๊ฐ๋ก์ ์ธ๋ก๋ก ์ค๊ฐ ๋ถ๋ถ์ ์๋ผ์ <๊ทธ๋ฆผ 2>์ I, II, III, IV์ ๊ฐ์ด ๋๊ฐ์ ํฌ๊ธฐ์ ๋ค ๊ฐ์ N/2 × N/2์์ข ์ด๋ก ๋๋๋ค. ๋๋์ด์ง ์ข ์ด I, II, III, IV ๊ฐ๊ฐ์ ๋ํด์๋ ์์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ ์์ง ์์ผ๋ฉด ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋๊ฐ์ ํฌ๊ธฐ์ ๋ค ๊ฐ์ ์์ข ์ด๋ก ๋๋๋ค. ์ด์ ๊ฐ์ ๊ณผ์ ์ ์๋ผ์ง ์ข ์ด๊ฐ ๋ชจ๋ ํ์์ ๋๋ ๋ชจ๋ ํ๋์์ผ๋ก ์น ํด์ ธ ์๊ฑฐ๋, ํ๋์ ์ ์ฌ๊ฐํ ์นธ์ด ๋์ด ๋ ์ด์ ์๋ฅผ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์์ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ ์๋์ ๋ <๊ทธ๋ฆผ 3>์ <๊ทธ๋ฆผ 1>์ ์ข ์ด๋ฅผ ์ฒ์ ๋๋ ํ์ ์ํ๋ฅผ, <๊ทธ๋ฆผ 4>๋ ๋ ๋ฒ์งธ ๋๋ ํ์ ์ํ๋ฅผ, <๊ทธ๋ฆผ 5>๋ ์ต์ข ์ ์ผ๋ก ๋ง๋ค์ด์ง ๋ค์ํ ํฌ๊ธฐ์ 9์ฅ์ ํ์์ ์์ข ์ด์ 7์ฅ์ ํ๋์ ์์ข ์ด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ข ์ด์ ํ ๋ณ์ ๊ธธ์ด N๊ณผ ๊ฐ ์ ์ฌ๊ฐํ์นธ์ ์(ํ์์ ๋๋ ํ๋์)์ด ์ฃผ์ด์ง ๋ ์๋ผ์ง ํ์์ ์์ข ์ด์ ํ๋์ ์์ข ์ด์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ข ์ด์ ํ ๋ณ์ ๊ธธ์ด N์ด ์ฃผ์ด์ ธ ์๋ค. N์ 2, 4, 8, 16, 32, 64, 128 ์ค ํ๋์ด๋ค. ์์ข ์ด์ ๊ฐ ๊ฐ๋ก์ค์ ์ ์ฌ๊ฐํ์นธ๋ค์ ์์ด ์์ค๋ถํฐ ์ฐจ๋ก๋ก ๋์งธ ์ค๋ถํฐ ๋ง์ง๋ง ์ค๊น์ง ์ฃผ์ด์ง๋ค. ํ์์์ผ๋ก ์น ํด์ง ์นธ์ 0, ํ๋์์ผ๋ก ์น ํด์ง ์นธ์ 1๋ก ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ซ์ ์ฌ์ด์๋ ๋น์นธ์ด ํ๋์ฉ ์๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ์๋ผ์ง ํ์์ ์์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๊ณ , ๋์งธ ์ค์๋ ํ๋์ ์์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 2
- ๐ ๋ฌธ์ ์ ํ : ๋ถํ ์ ๋ณต, ์ฌ๊ท
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ์์์ ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ์ข ์ด์ ๋ํด ๋ชจ๋ ๊ฐ์ ์์์ธ์ง๋ฅผ ์ฒดํฌํ๋ค
- ์์์ด ๊ฐ๋ค๋ฉด ํด๋น ์์์ ์ข ์ด์ ๊ฐ์๋ฅผ 1 ์ฆ๊ฐ์์ผ ์ฃผ์๋ค.
- ์์์ด ๊ฐ์ง ์๋ค๋ฉด, ํ์ฌ ์ข ์ด์ ์์์ด ๊ฐ์์ง ๋๊น์ง 4๋ฑ๋ถ(์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋)์ผ๋ก ๋ถํ ํ์ฌ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๐ ๋ถํ ์ ๋ณต(Divide and Conquer)์ด๋ ?
- ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ์ผ๋ก ๋๋์ด ํด๊ฒฐํ๊ณ , ๊ทธ ํด๋ฅผ ๊ฒฐํฉํ์ฌ ์ ์ฒด ๋ฌธ์ ์ ํด๋ฅผ ์ป๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ท์ ์ธ ๋ฐฉ๋ฒ์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ,
- ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ธ ์ด์ง ํ์(Binary Search), ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ธ ๋ณํฉ ์ ๋ ฌ(Merge Sort), ํต ์ ๋ ฌ(Quick Sort) ๋ฑ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ ํฉํ๊ฒ ์ฌ์ฉ๋๋ค.
๐ ๋ถํ ์ ๋ณต๊ณผ ๋์ ๊ณํ๋ฒ ์๊ณ ๋ฆฌ์ฆ ์ฐจ์ด
- ๋ถํ ์ ๋ณต๊ณผ ๋์ ๊ณํ๋ฒ์ ๋ ๋ค ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ์ด์ง๋ง, ๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ํด๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๋์ง์ ์ฐจ์ด๊ฐ ์๋ค.
- ๋์ ๊ณํ๋ฒ์์๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋๊ณ , ๋์ค์ ํ์ํ ๋ ์ด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ํผํ๋ค.
- ๋ถํ ์ ๋ณต์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋ํด ์ค๋ณต์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํด๊ฒฐ๋๋ค.
๐ ๋ถํ ์ ๋ณต ๋จ๊ณ
์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ถํ โก ์ ๋ณต โก ๊ฒฐํฉ์ ์ธ ๋จ๊ณ๋ก ๋๋์ด ํด๊ฒฐํ๋ค.
- ๋ถํ (Divide)
- ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๋ค.
- ์ ๋ณต(Conquer)
- ๊ฐ๊ฐ์ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ์ฌ๊ท์ ์ผ๋ก ํด๊ฒฐํ๋ค.
- ๊ฒฐํฉ(Combine)
- ์์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๋ฅผ ๊ฒฐํฉํ์ฌ ์ฃผ์ด์ง ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํ๋ค.
๐น ๋ถํ ์ ๋ณต์ ์ฌ๊ท์ ๋ฐฉ๋ฒ์ ๋ํ ๋น๊ต
๐ธ ๋ถํ ์ ๋ณต ์ฅ์
- ํจ์จ์ ์ธ ์ฑ๋ฅ
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํจ์ผ๋ก์จ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ๊ฒฐํฉํ์ฌ ์ ์ฒด ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
- ๋ชจ๋ํ์ ์ ์ง๋ณด์ ์ฉ์ด์ฑ
- ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํด๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ํ๊ฐ ์ ๋์ด ์๋ค.
- ์ด๋ก ์ธํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ฆ๊ฐํ๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๋ถํ ๋ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ํด๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฒ๋ฆฌ์ ์ฉ์ดํ๋ค.
- ๋ฐ๋ผ์, ๋ถ์ฐ ์์คํ ์ด๋ ๋ค์ค ์ฝ์ด๋ฅผ ํ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์ํ ์ ์๋ค.
๐ธ ๋ถํ ์ ๋ณต ๋จ์
- ์ค๋ฒํค๋ & ์คํ ์ค๋ฒํ๋ก์ฐ
- ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ค๋ ์ ์์ ํจ์ ํธ์ถ๋ก ์ธํ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ฌ๊ท ํธ์ถ์ ๊น์ด๊ฐ ๋๋ฌด ๊น์ด์ง ๊ฒฝ์ฐ, ์คํ์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์คํ ์ค๋ฒํ๋ก์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
- ์ ์ฉ ๊ฐ๋ฅ์ฑ ์ ์ฝ
- ๋ชจ๋ ๋ฌธ์ ๊ฐ ๋ถํ ์ ๋ณต์ ์ ํฉํ ๊ฒ์ ์๋๋ค.
- ํนํ, ๋ฌธ์ ๋ฅผ ์ ์ ํ ๋๋์ด ํด๊ฒฐํ๋ ๊ฒ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ์ ์์กด์ฑ์ด ํฐ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค.
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ์ฌ๊ท ํธ์ถ์ด๋ ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์๋ ์ ์๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 13176KB
์๊ฐ : 112ms
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int white = 0;
static int blue = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // ์ข
์ด ํ ๋ณ์ ๊ธธ์ด
map = new int[n][n]; // ์ ์ฒด ์ข
์ด, ํ์์ 0 ํ๋์ 1
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
partition(0, 0, n); // ์์์ , ํ ๋ณ์ ๊ธธ์ด
bw.append(white + "\n" + blue);
bw.flush();
bw.close();
br.close();
}
private static void partition(int x, int y, int size) {
if (checkColor(x, y, size)) { // true -> ๊ฐ์ ์์ด ์น ํด์ง ๊ณณ
if (map[x][y] == 1) blue++;
else white++;
return;
}
int newSize = size/2; // ๋ถํ ๋ ์๋ก์ด ํฌ๊ธฐ
partition(x, y, newSize); // ์ข์ธก ์๋จ
partition(x+newSize, y, newSize); // ์ฐ์ธก ์๋จ
partition(x, y+newSize, newSize); // ์ข์ธก ํ๋จ
partition(x+newSize, y+newSize, newSize); // ์ฐ์ธก ํ๋จ
}
private static boolean checkColor(int x, int y, int size) {
int color = map[x][y]; // ์ฒซ๋ฒ์งธ ์ ๊ธฐ์ค
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
// ์์ด ๊ฐ์ง ์์๋ ๋ถํ
if (color != map[i][j]) return false;
}
}
return true;
}
}
๐ ํจ๊ป ํ์ด๋ณด๋ฉด ์ข์ ๋ฐฑ์ค ๋ฌธ์
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1074] Z (1) | 2023.11.28 |
---|---|
[Boj_1992] ์ฟผ๋ํธ๋ฆฌ (1) | 2023.11.28 |
[Boj_20002] ์ฌ๊ณผ๋๋ฌด (0) | 2023.11.21 |
[Boj_1446] ์ง๋ฆ๊ธธ (0) | 2023.11.21 |
[Boj_1504] ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (0) | 2023.11.21 |