본문 바로가기
알고리즘 문제풀이/백준

[백준 2630] 색종이 만들기

by m2162003 2021. 1. 27.

www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

divide and conquer로 카테고리로 분리가 되어있지만

재귀함수를 사용하자...

 

#include <stdio.h>

using namespace std;
int n;
int arr[129][129];
int res[2];

bool isValid(int x, int y, int len)
{
  int cmp = arr[x][y];
  for (int i = x; i < x + len; i++)
  {
    for (int j = y; j < y + len; j++)
    {
      if (cmp != arr[i][j])
      {
        return false;
      }
    }
  }
  return true;
}
void ref(int x, int y, int len)
{
  if (len == 1)
  {
    res[arr[x][y]]++;
    return;
  }

  if (isValid(x, y, len))
  {
    res[arr[x][y]]++;
    return;
  }

  len /= 2;
  ref(x, y, len);
  ref(x + len, y, len);
  ref(x, y + len, len);
  ref(x + len, y + len, len);
}
int main(void)
{
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      scanf("%d", &arr[i][j]);
    }
  }

  ref(0, 0, n);

  printf("%d\n%d\n", res[0], res[1]);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1043] 거짓말  (0) 2021.01.30
[백준 11660] 구간 합 구하기 5  (0) 2021.01.28
[백준 1197] 최소 스패닝 트리  (0) 2021.01.26
[백준 9372] 상근이의 여행  (0) 2021.01.25
[백준 1080] 행렬  (0) 2021.01.24

댓글