반응형

https://www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. 하얀색으로 칠해진 칸은 0, 파란색으로 칠해진 칸은 1로 주어지며, 각 숫자 사이에는 빈칸이 하나씩 있다.

www.acmicpc.net

4분 탐색(?) 분할정복! 

4개로 나누어서 다시 탐색하고 해당 안 되면 다시 탐색하고~

import java.util.*;
import java.io.*;
public class Main {
	public static int map[][];
	public static int white,blue;
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		map = new int[N][N];
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				map[i][j] = sc.nextInt();
			}
		}
		
		find(0,0,N,N);
		System.out.println(white);
		System.out.print(blue);
	}
	public static void find(int startRow, int StartCol, int EndRow, int EndCol) {
		
		int sum = 0;
		for (int i = startRow; i < EndRow; i++) {
			for (int j = StartCol; j < EndCol; j++) {
				sum+= map[i][j];
			}
		}
		if(sum==0) { 
			white++;
			return;
		}
		else if(sum == (EndCol - StartCol) * (EndRow - startRow)) { 
			blue++;
			return;
		}
		else {
			find(startRow,   StartCol,   (startRow+EndRow)/2, (StartCol+EndCol)/2);
			find((startRow+EndRow)/2,   StartCol,   EndRow,   (StartCol+EndCol)/2);
			find(startRow,   (StartCol+EndCol)/2,   (startRow+EndRow)/2, EndCol);
			find((startRow+EndRow)/2,   (StartCol+EndCol)/2,   EndRow,   EndCol);
		}
	}
}
반응형

+ Recent posts