문제
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
접근방식
현재의 시작점 x,y에서 size만큼 탐색하면서 중간에 다른 값이 없는 경우 flag를 true로 가지고 board의 값을 뽑아줌. 중간에 다른 값이 있는 경우 4분할하여 재귀를 돌면서 탐색함.
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N,board[][];
static StringBuilder answer = new StringBuilder();
public static void DFS(int x,int y, int size) {
if(size == 1) {
answer.append(board[x][y]);
return;
}
int start = board[x][y];
boolean flag = true;
for (int i = x; i < x+size; i++) {
for (int j = y; j < y+size; j++) {
if(board[i][j]!=start) {
flag = false;
break;
}
}
}
if(flag) {
answer.append(start);
return;
}else {
answer.append("(");
for (int i = x; i <= x+size/2; i+=size/2) {
for (int j = y; j <= y+size/2; j+=size/2) {
DFS(i,j,size/2);
}
}
answer.append(")");
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
board = new int[N][N];
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < N; j++) {
board[i][j] = str.charAt(j)-'0';
}
}
DFS(0,0,N);
System.out.println(answer);
}
}
'알고리즘' 카테고리의 다른 글
[SWEA 1873] 상호의 배틀필드 자바 (0) | 2023.08.17 |
---|---|
[SWEA 5644] 무선 충전 자바 (0) | 2023.08.17 |
[SWEA 1249] 보급로 자바 BFS (0) | 2023.07.09 |