백준

백준 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++;
  }
}