๐Ÿ• Baaaaaarking/0x0B๊ฐ• - ์žฌ๊ท€

[BOJ S2][C++] ๋ฐฑ์ค€ 1780๋ฒˆ : ์ข…์ด์˜ ๊ฐœ์ˆ˜

์„ ๋‹ฌ 2022. 5. 19. 12:47
๋ฐ˜์‘ํ˜•

https://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 ≤ 37, N์€ 3k ๊ผด)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— -1๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ, ๋‘˜์งธ ์ค„์— 0์œผ๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ, ์…‹์งธ ์ค„์— 1๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€์—ˆ๋‹ค

1. n*n ํฌ๊ธฐ๋งŒํผ ์ „์ฒด ๊ฒ€์‚ฌํ•˜๋ฉด์„œ

2. ํ•œ๊ฐœ์˜ ์ข…์ด๋ผ๊ณ  ํŒ๋‹จ์ด ๋˜๋ฉด (checkํ•จ์ˆ˜) ํ•ด๋‹น ์ข…์ด๋ฅผ ์นด์šดํŠธ ํ›„ ๋ฆฌํ„ด

3. (n/3)*(n/3) ํฌ๊ธฐ๋งŒํผ ์ „์ฒด ๊ฒ€์‚ฌ (1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ)

 

์žฌ๊ท€์ž์ฒด๋ฅผ ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ์‚ด์ง.. ์–ด๋ ต๊ธด ํ•˜์ง€๋งŒ

๊ทธ๋ž˜๋„ ์žฌ๊ท€์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด ๊ทธ๋Ÿญ์ €๋Ÿญ ํ’€  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

(๋ฌผ๋ก  ๋‚˜๋Š” ์žฌ๊ท€ ์–ด๋ ต๋‹ค)

 

// Authored by : seondal
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int N;
int paper[2190][2190];  //3^7 = 2187
int cnt[3];   // -1์ข…์ด ๊ฐฏ์ˆ˜, 0์ข…์ด ๊ฐฏ์ˆ˜, 1์ข…์ด ๊ฐฏ์ˆ˜

bool check(int n, int x, int y) {   // (x,y) ๋ถ€ํ„ฐ n๊ฐœ ํฌ๊ธฐ ์ข…์ด๊ฐ€ ๊ฐ™์€ ์ˆซ์ž๋กœ ์ฑ„์›Œ์กŒ๋Š”์ง€ ํ™•์ธ
    for(int i=x; i<x+n; i++)
        for(int j=y; j<y+n; j++)
            if(paper[i][j] != paper[x][y])
                return false;
    
    return true;
}

void recur(int n, int x, int y) {
    if(check(n,x,y)) {
        cnt[paper[x][y] + 1]++;
        return;
    }
    
    int next = n/3;
    for(int i=x; i < x + 3*next; i = i + next)
        for(int j=y; j < y + 3*next; j = j + next)
            recur(next, i, j);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    // ์ดˆ๊ธฐํ™”
    cnt[0] = 0; cnt[1] = 0; cnt[2] = 0;
    
    // ์ž…๋ ฅ
    cin >> N;
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            cin >> paper[i][j];
    
    // ์žฌ๊ท€
    recur(N, 0, 0);
    
    //์ถœ๋ ฅ
    cout << cnt[0] << "\n" << cnt[1] << "\n" << cnt[2];
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•