https://www.acmicpc.net/problem/2630
2630번: 색종이 만들기
첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
www.acmicpc.net
- 문제
- 문제풀이
분할정복(divide and conquer) 알고리즘을 사용하여, NxN 크기의 배열에서 모든색이 같은 색종이의 개수를 찾는 문제를 해결해야한다.
이 문제는 큰 배열을 작은 크기의 4개의 배열로 나눈 뒤, 각각의 배열에서 두 번째로 작은 값을 찾는 과정을 반복하여 해결합니다. 따라서, 재귀함수를 사용하여 문제를 풀어나간다.
- 코드 1
using System.Collections.Immutable;
using System.Text;
using System.Xml;
namespace ConsoleApp24
{
internal class Program
{
public static int[,] arr;
public static int white=0;
public static int blue=0;
public static void Check(int size, int x, int y)
{
int color = 2;
bool check = true;
if(arr[x, y] == 1)
{
color = 1;
}
else
{
color = 0;
}
for(int a = x; a < x + size; a++)
{
for(int b = y; b < y + size; b++)
{
if (arr[a, b] != color)
{
check = false;
break;
}
}
if (!check) break;
}
if (check)
{
if (color == 1)
{
blue++;
}
else
{
white++;
}
}
else
{
Check(size / 2, x, y);
Check(size / 2, x + size / 2, y);
Check(size / 2, x, y + size / 2);
Check(size / 2, x + size / 2, y + size / 2);
}
}
public static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
int N = int.Parse(Console.ReadLine());
arr = new int[N, N];
for(int i = 0; i < N; i++)
{
string[] input = Console.ReadLine().Split();
for(int j = 0; j < N; j++)
{
arr[i, j] = int.Parse(input[j]);
}
}
Check(N, 0, 0);
Console.WriteLine(white);
Console.WriteLine(blue);
}
}
}
- 후기
분할정복을 배웠다...!
'백준 > C#' 카테고리의 다른 글
[C#]백준 11399번: ATM (0) | 2023.07.19 |
---|---|
[C#]백준 1931번: 회의실 배정 (0) | 2023.07.19 |
[C#]백준 24460번: 특별상이라도 받고 싶어 (0) | 2023.03.29 |
[C#]백준 1786번: 찾기 (0) | 2023.03.15 |
[C#]백준 10872: 팩토리얼 (0) | 2023.03.15 |