Algorithm/Baekjoon

[ Baekjoon ] 1780번 - 종이의 개수

또잉코딩 2021. 1. 23. 18:53
 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

 

풀이 방법

최근에 푼 백준 1992번과 유사한 문제이다. 

 

[ Baekjoon ] 1992번 - 쿼드트리

1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다.

sss20-02.tistory.com

 

구현코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Q_1780 {
	static int[][] array;
	static int[] count = new int[3];
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int N = Integer.parseInt(br.readLine());
		array = new int[N][N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				array[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		divide(0, N-1, 0, N-1);
		
		for (int i = 0; i < 3; i++) {
			System.out.println(count[i]);
		}
	}
	
	public static void divide(int i_start, int i_end, int j_start, int j_end) {
		if (check(i_start, i_end, j_start, j_end)) {
			int value = array[i_start][j_start] + 1;
			count[value] += 1;
			return;
		} else if (i_start < i_end && j_start < j_end){
			int length = (i_end - i_start + 1) / 3;
			
			for (int i = 0; i < 3; i++) { // 9등분
				for (int j = 0; j < 3; j++) {
					divide(i_start+length*i, i_start+length*(i+1)-1, j_start+length*j, j_start+length*(j+1)-1);
				}
			}
		}
	}
	
	// 모두 -1인지 혹은 모두 0인지 혹은 모두 1인지 check
	public static boolean check(int i_start, int i_end, int j_start, int j_end) {
		int value = array[i_start][j_start]; // 영역의 시작점
		
		for (int i = i_start; i <= i_end; i++) {
			for (int j = j_start; j <= j_end; j++) {
				if (array[i][j] != value)
					return false;
			}
		}
		
		return true;
	}
}

'Algorithm > Baekjoon' 카테고리의 다른 글

[ Baekjoon ] 1753번 - 최단경로  (0) 2021.02.04
[ Baekjoon] 2448번 - 별 찍기 - 11  (0) 2021.01.25
[ Baekjoon ] 1629번 - 곱셈  (0) 2021.01.23
[ Baekjoon ] 1992번 - 쿼드트리  (0) 2021.01.21
[ Baekjoon ] 1520번 - 내리막 길  (0) 2021.01.18