Game Develop

[Algorithm] Baekjoon 1780번 : 종이의 개수 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 1780번 : 종이의 개수

MaxLevel 2022. 10. 29. 06:24

https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int paper[2200][2200];
map<intint> countMap;
 
void recur(int leftTopY, int leftTopX, int size)
{
    int element = paper[leftTopY][leftTopX];
    bool isDivide = false;
 
    for (int i = leftTopY; i < leftTopY + size; i++)
    {
        for (int j = leftTopX; j < leftTopX + size; j++)
        {
            if (paper[i][j] != element)
            {
                isDivide = true;
                break;
            }
        }
    }
 
    if (!isDivide)
    {
        countMap[element] += 1;
        return;
    }
 
    // 분할.
 
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            recur(leftTopY + i * size / 3, leftTopX + j * size / 3size / 3);
        }
    }
}
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    int n = 0;
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> paper[i][j];
        }
    }
 
    recur(00, n);
 
    cout << countMap[-1<< endl << countMap[0<< endl << countMap[1];
    return 0;
}
cs

이제 분할문제도 나름 쉽게 풀수 있게 되었다.

현재 solved.ac에서 class 3의 문제들만 풀고 있는데, 이런 유형의 문제가 벌써 3개가 나온걸 보니 나름 중요한 유형인가보다. 

이 문제도 이전문제들과 똑같이 영역내의 원소가 같은지 체크하고 아니면 분할하는 그런 문제다.