이전에 풀었던 쿼드트리 문제와 푸는 방식은 동일하다.
한 종이가 파란색 또는 흰색 둘 중 하나의 색으로만 이루어져있다면
그 색으로만 이루어진 종이의 수를 증가시킨다.
종이가 하나의 색으로 이루어져있지 않다면 그 종이를 같은 크기로 4분할을 하고 위 과정을 반복하면 된다.
1. n을 입력받는다.
2. 종이에 각 칸이 어떤 색인지 저장할 2차원 배열 arr[n][n]를 생성한다
3. arr에 입력받은 값을 저장한다.
4. 흰색 종이의 개수와 파란색 종이의 개수를 저장할 배열 cnt[2]를 생성한다.
5. 종이가 하나의 색으로만으로 이루어져있는지 확인하는 함수 colorCheck를 구현한다.
종이의 첫번째 칸을 color라는 변수에 저장하고, 그 종이의 모든 칸이 color와 같은지 체크한다.
color와 색이 다른 칸이 있다면 -1을 반환한다.
종이가 흰색으로만 이루어져있으면 0을 반환한다.
종이가 파란색으로만 이루어져있으면 1을 반환한다.
6. 종이를 4분할을 하는 함수 partition을 구현한다.
colorCheck함수로 종이가 하나의 색으로만 이루어져있는지 확인한다.
colorCheck함수의 반환값이 -1이면(다른 색이 섞여있다면)
그 종이를 4분할해 partition함수를 재귀호출한다.
0이거나 1이면 이에 따라 cnt[0]나 cnt[1]의 값을 증가시켜 흰색, 파란색 종이의 개수를 센다.
7. cnt[0]과 cnt[1]을 출력한다.
import java.io.*;
import java.util.*;
public class Main{
static int arr[][];
static int[] cnt = new int[2];
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
arr = new int[n][n];
for(int i=0;i<n;i++){
st = new StringTokenizer(br.readLine(), " ");
for(int j=0;j<n;j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
partition(0,0,n);
System.out.println(cnt[0]);
System.out.println(cnt[1]);
}
static void partition(int x, int y, int size){
if(colorCheck(x,y,size)==0){
cnt[0]++;
}else if(colorCheck(x,y,size)==1){
cnt[1]++;
}
else{
int newsize = size/2;
partition(x,y,newsize);
partition(x,y+newsize,newsize);
partition(x+newsize,y,newsize);
partition(x+newsize,y+newsize,newsize);
}
}
static int colorCheck(int x, int y, int size){
int color = arr[x][y];
for(int i=x;i<x+size;i++){
for(int j=y;j<y+size;j++){
if(color!=arr[i][j]) return -1;
}
}
if(color ==0) return 0;
else return 1;
}
}
'Algorithm > [BOJ] - JAVA' 카테고리의 다른 글
[백준] 2261 : 가장 가까운 두 점 JAVA 풀이 (0) | 2022.09.16 |
---|---|
[백준] 6549 : 히스토그램에서 가장 큰 직사각형 JAVA 풀이 (0) | 2022.09.15 |
[백준] 1517 : 버블소트 JAVA 풀이 (0) | 2022.09.12 |
[백준] 2448 : 별 찍기 - 11 JAVA 풀이 (0) | 2022.09.12 |
[백준] 1992 : 쿼드트리 JAVA 풀이 (0) | 2022.09.10 |