πŸ’»

[λ°±μ€€] 뢄할정볡 - 1780. μ’…μ΄μ˜ 개수 λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] 뢄할정볡 - 1780. μ’…μ΄μ˜ 개수

λ˜νš¨λ‹ˆ 2020. 10. 21. 17:00

www.acmicpc.net/problem/1780

 

1780번: μ’…μ΄μ˜ 개수

N×N크기의 ν–‰λ ¬λ‘œ ν‘œν˜„λ˜λŠ” 쒅이가 μžˆλ‹€. μ’…μ΄μ˜ 각 μΉΈμ—λŠ” -1, 0, 1의 μ„Έ κ°’ 쀑 ν•˜λ‚˜κ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€. μš°λ¦¬λŠ” 이 행렬을 μ μ ˆν•œ 크기둜 자λ₯΄λ €κ³  ν•˜λŠ”λ°, μ΄λ•Œ λ‹€μŒμ˜ κ·œμΉ™μ— 따라 자λ₯΄λ €κ³  ν•œλ‹€.

www.acmicpc.net

문제

N×N크기의 ν–‰λ ¬λ‘œ ν‘œν˜„λ˜λŠ” 쒅이가 μžˆλ‹€. μ’…μ΄μ˜ 각 μΉΈμ—λŠ” -1, 0, 1의 μ„Έ κ°’ 쀑 ν•˜λ‚˜κ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€. μš°λ¦¬λŠ” 이 행렬을 μ μ ˆν•œ 크기둜 자λ₯΄λ €κ³  ν•˜λŠ”λ°, μ΄λ•Œ λ‹€μŒμ˜ κ·œμΉ™μ— 따라 자λ₯΄λ €κ³  ν•œλ‹€.

  1. λ§Œμ•½ 쒅이가 λͺ¨λ‘ 같은 수둜 λ˜μ–΄ μžˆλ‹€λ©΄ 이 쒅이λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•œλ‹€.
  2. (1)이 μ•„λ‹Œ κ²½μš°μ—λŠ” 쒅이λ₯Ό 같은 크기의 9개의 μ’…μ΄λ‘œ 자λ₯΄κ³ , 각각의 잘린 쒅이에 λŒ€ν•΄μ„œ (1)의 과정을 λ°˜λ³΅ν•œλ‹€.

이와 같이 쒅이λ₯Ό μž˜λžμ„ λ•Œ, -1둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수, 0으둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수, 1둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수λ₯Ό κ΅¬ν•΄λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 N(1≤N≤3^7, N은 3^k κΌ΄)이 주어진닀. λ‹€μŒ N개의 μ€„μ—λŠ” N개의 μ •μˆ˜λ‘œ 행렬이 주어진닀.

좜λ ₯

첫째 쀄에 -1둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수λ₯Ό, λ‘˜μ§Έ 쀄에 0으둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수λ₯Ό, μ…‹μ§Έ 쀄에 1둜만 μ±„μ›Œμ§„ μ’…μ΄μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

9

0 0 0 1 1 1 -1 -1 -1

0 0 0 1 1 1 -1 -1 -1

0 0 0 1 1 1 -1 -1 -1

1 1 1 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0

0 1 -1 0 1 -1 0 1 -1

0 -1 1 0 1 -1 0 1 -1

0 1 -1 1 0 -1 0 1 -1

예제 좜λ ₯ 1

10

12

11

 

 

λŠλ‚€μ 

39 라인에 return문을 넣지 μ•Šμ•„μ„œ ν•œμ°Έμ„ ν—€λ§Έλ‹€.

 

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
61
62
63
64
//1780. μ’…μ΄μ˜ κ°œμˆ˜
#include <iostream>
#include <vector>
 
using namespace std;
 
int n;
int map[2187][2187];
int minusone = 0, zero = 0, one = 0;
void cut(int x, int y, int size){
    int value = map[x][y];
 
    if(size==1){
        if(value == -1) {
            minusone ++;
            return;
        }else if(value == 0){ 
            zero ++;
            return;
        }else {
            one ++
            return;
        }
    }
 
    bool check = true;
    for(int i=x; i<x+size; i++){
        for(int j=y; j<y+size; j++){
            if(map[i][j]!=value){
                check = false;
                break;
            }
        }
    }
    if(check){
        if(value == -1) minusone ++;
        else if(value == 0) zero ++;
        else one ++
        return;
    }
 
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            cut(x+size*i/3, y+size*j/3size/3);
        }
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> map[i][j];
        }
    }
    
    cut(00, n);
 
    cout << minusone << "\n" << zero << "\n" << one << "\n";
 
    return 0;
}
cs
λ°˜μ‘ν˜•
Comments