๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1992
1992๋ฒ: ์ฟผ๋ํธ๋ฆฌ
์ฒซ์งธ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ซ์ N ์ด ์ฃผ์ด์ง๋ค. N ์ ์ธ์ ๋ 2์ ์ ๊ณฑ์๋ก ์ฃผ์ด์ง๋ฉฐ, 1 ≤ N ≤ 64์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ๋ ๊ธธ์ด N์ ๋ฌธ์์ด์ด N๊ฐ ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ 0 ๋
www.acmicpc.net
โธ ๋ฌธ์
ํ๋ฐฑ ์์์ ์์ถํ์ฌ ํํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฟผ๋ ํธ๋ฆฌ(Quad Tree)๋ผ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํฐ ์ ์ ๋ํ๋ด๋ 0๊ณผ ๊ฒ์ ์ ์ ๋ํ๋ด๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์์(2์ฐจ์ ๋ฐฐ์ด)์์ ๊ฐ์ ์ซ์์ ์ ๋ค์ด ํ ๊ณณ์ ๋ง์ด ๋ชฐ๋ ค์์ผ๋ฉด, ์ฟผ๋ ํธ๋ฆฌ์์๋ ์ด๋ฅผ ์์ถํ์ฌ ๊ฐ๋จํ ํํํ ์ ์๋ค.
์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ผ๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "0"์ด ๋๊ณ , ๋ชจ๋ 1๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "1"์ด ๋๋ค. ๋ง์ฝ 0๊ณผ 1์ด ์์ฌ ์์ผ๋ฉด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ํ๋ด์ง๋ฅผ ๋ชปํ๊ณ , ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋, ์ด๋ ๊ฒ 4๊ฐ์ ์์์ผ๋ก ๋๋์ด ์์ถํ๊ฒ ๋๋ฉฐ, ์ด 4๊ฐ์ ์์ญ์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋๋ก ๊ดํธ ์์ ๋ฌถ์ด์ ํํํ๋ค
์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ์ ์์์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ซ์๋ก ์ฃผ์ด์ง๋ฉฐ, ์ด ์์์ ์ฟผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์์ถํ๋ฉด "(0(0011)(0(0111)01)1)"๋ก ํํ๋๋ค. N ×N ํฌ๊ธฐ์ ์์์ด ์ฃผ์ด์ง ๋, ์ด ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ซ์ N ์ด ์ฃผ์ด์ง๋ค. N ์ ์ธ์ ๋ 2์ ์ ๊ณฑ์๋ก ์ฃผ์ด์ง๋ฉฐ, 1 ≤ N ≤ 64์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ๋ ๊ธธ์ด N์ ๋ฌธ์์ด์ด N๊ฐ ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ 0 ๋๋ 1์ ์ซ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์์์ ๊ฐ ์ ๋ค์ ๋ํ๋ธ๋ค.
โธ ์ถ๋ ฅ
์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 1
- ๐ ๋ฌธ์ ์ ํ : ๋ถํ ์ ๋ณต, ์ฌ๊ท
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ์์ ํฌ์คํ ํ๋ ์์ข ์ด ๋ง๋ค๊ธฐ์ ์ ์ฌํ๋ ๋ฌธ์ ๋ค.
- ๋จผ์ ์์์ ์ ๊ธฐ์ค์ผ๋ก ์ ์ฒด ํฌ๊ธฐ์ ๋ํด ํ๋์ ์ ์ผ๋ก ์์ถ์ด ๊ฐ๋ฅํ์ง ์ฒดํฌํ๋ค.
- ์์ถ์ด ๊ฐ๋ฅํ๋ค๋ฉด, ํ๋์ ์ ์ผ๋ก ์์ถํด ์ฃผ์๋ค.
- ์์ถ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ฉด, ์์ถ์ด ๊ฐ๋ฅํด์ง ๋๊น์ง 4๋ฑ๋ถ(์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋)์ผ๋ก ๋ถํ ํ์ฌ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ด ํด๊ฒฐํ๋ค.
- ์ด๋, ๊ฐ ๊น์ด์ ๋ํด ์ฌ๋ ๊ดํธ๋ก ์์ํด ์ฃผ๊ณ ํด๋น ๊น์ด๊ฐ ๋๋ฌ๋ค๋ฉด ๋ซ๋ ๊ดํธ๋ก ๋ซ์์ฃผ์๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 11668KB
์๊ฐ : 80ms
import java.io.*;
public class Main {
static int n;
static int[][] map;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine()); // ์์์ ํฌ๊ธฐ
map = new int[n][n]; // ์์
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < n; j++) {
map[i][j] = str.charAt(j)-'0';
}
}
partition(0, 0, n); // ์์์ , ํ ๋ณ์ ๊ธธ์ด
System.out.println(sb.toString());
}
private static void partition(int x, int y, int size) {
if (colorCheck(x, y, size)) { // ์์ถ์ด ๊ฐ๋ฅํ๋ค๋ฉด
sb.append(map[x][y]); // ํ๋์ ์ ์ผ๋ก ์์ถ
return;
}
// ์์ถ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ฉด ์ ๋ฐ์ผ๋ก ๋๋์ด ๋ถํ
int newSize = size/2;
sb.append("("); // ๊ฐ ๊น์ด์์ ์ฌ๋ ๊ดํธ ์์
partition(x, y, newSize); // ์ผ์ชฝ ์
partition(x, y+newSize, newSize); // ์ค๋ฅธ์ชฝ ์
partition(x+newSize, y, newSize); // ์ผ์ชฝ ์๋
partition(x+newSize, y+newSize, newSize); // ์ค๋ฅธ์ชฝ ์๋
sb.append(")"); // ํด๋น ๊น์ด๊ฐ ๋๋๋ฉด ๋ซ๋ ๊ดํธ๋ก ๋ซ๊ธฐ
}
private static boolean colorCheck(int x, int y, int size) {
int dot = map[x][y]; // ์ฒซ๋ฒ์งธ ์ ๊ธฐ์ค
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
// ๊ฐ์ ์ ์ด ์๋๋ผ๋ฉด false ๋ฆฌํด
if (map[i][j] != dot) return false;
}
}
return true;
}
}
๐ ํจ๊ป ํ์ด๋ณด๋ฉด ์ข์ ๋ฐฑ์ค ๋ฌธ์
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_2447] ๋ณ ์ฐ๊ธฐ - 10 (0) | 2023.11.28 |
---|---|
[Boj_1074] Z (1) | 2023.11.28 |
[Boj_2630] ์์ข ์ด ๋ง๋ค๊ธฐ (0) | 2023.11.24 |
[Boj_20002] ์ฌ๊ณผ๋๋ฌด (0) | 2023.11.21 |
[Boj_1446] ์ง๋ฆ๊ธธ (0) | 2023.11.21 |