백준
백준 2630 색종이 만들기(Java)
Park DJ
2023. 2. 8. 12:26
https://www.acmicpc.net/problem/2630
2630번: 색종이 만들기
첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
www.acmicpc.net
해석 및 팁
이 문제는 분할정복을 사용하는 문제입니다. 색상이 모두 같은 경우가 아니라면 4개로 쪼개서 다시 색상을 확인합니다. 4개로 쪼개는 것은 재귀함수를 활용하면 되고 색상이 모두 같은 경우만 색상을 확인하여 카운트해 주면 됩니다.
https://namu.wiki/w/분할%20정복%20알고리즘
분할 정복 알고리즘 - 나무위키
분할 정복(Divide and Conquer)은 여러 알고리즘의 기본이 되는 해결방법으로, 기본적으로는 엄청나게 크고 방대한 문제를 조금씩 조금씩 나눠가면서 용이하게 풀 수 있는 문제 단위로 나눈 다음 그
namu.wiki
Java 코드
import java.util.Scanner;
public class Main {
static int col;
static int n;
static int w;
static int b;
static int[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
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(w+"\n"+b);
System.out.println(sb);
}
public static void div(int x, int y, int r) {
for(int i = x; i < x + r; i++) {
for(int j = y; j < y + r; j++) {
col = arr[x][y];
if(col != arr[i][j]) {
div(x, y, r / 2);
div(x + r / 2, y , r / 2);
div(x, y + r / 2 , r / 2);
div(x + r / 2, y + r / 2 , r / 2);
return;
}
}
}
if(col == 0) w++;
else b++;
}
}