https://www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
해석 및 팁
이 문제는 백준 2640 색종이 만들기 문제와 유사한 문제입니다. 동일하게 분할정복을 사용하면 되는 문제이며 9등분해야 하므로 재귀를 9번 하면 되는 문제입니다.
Java 코드
import java.util.Scanner;
public class Main {
static int m1 = 0;
static int z = 0;
static int p1 = 0;
static int n;
static int col;
static int[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int n = sc.nextInt();
arr = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) arr[i][j] = sc.nextInt();
}
div(0, 0, n);
sb.append(m1 + "\n" + z + "\n" +p1);
System.out.println(sb);
}
public static void div(int x, int y, int num) {
for(int i = x; i < x + num; i++) {
for(int j = y; j < y + num; j++) {
col = arr[x][y];
if(arr[i][j] != col) {
div(x, y, num / 3);
div(x + num / 3, y, num / 3);
div(x, y + num / 3, num / 3);
div(x + num / 3, y + num / 3, num / 3);
div(x + num * 2 / 3, y, num / 3);
div(x, y + num * 2 / 3, num / 3);
div(x + num * 2 / 3, y + num / 3, num / 3);
div(x + num / 3, y + num * 2 / 3, num / 3);
div(x + num * 2 / 3, y + num * 2 / 3, num / 3);
return;
}
}
}
if(col == -1) m1++;
else if(col == 1) p1++;
else z++;
}
}
'백준' 카테고리의 다른 글
백준 11055 가장 큰 증가 부분 수열(Java) (0) | 2023.02.08 |
---|---|
백준 11051 이항 계수 2(Java) (0) | 2023.02.08 |
백준 1406 에디터(Java) (0) | 2023.02.08 |
백준 2630 색종이 만들기(Java) (0) | 2023.02.08 |
백준 11725 트리의 부모 찾기(Java) (0) | 2023.02.08 |