본문 바로가기

알고리즘

[백준 1992] 쿼드트리 자바 (분할 정복)

문제

 

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