• toc {:toc}

๋ฌธ์ œ

Nร—Nํฌ๊ธฐ์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ข…์ด์˜ ๊ฐ ์นธ์—๋Š” -1, 0, 1 ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ํ–‰๋ ฌ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ž๋ฅด๋ ค๊ณ  ํ•œ๋‹ค.

  1. ๋งŒ์•ฝ ์ข…์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ์ข…์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  2. (1)์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ข…์ด๋ฅผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ข…์ด 9๊ฐœ๋กœ ์ž๋ฅด๊ณ , ๊ฐ๊ฐ์˜ ์ž˜๋ฆฐ ์ข…์ด์— ๋Œ€ํ•ด์„œ (1)์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ด์™€ ๊ฐ™์ด ์ข…์ด๋ฅผ ์ž˜๋ž์„ ๋•Œ, -1๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜, 0์œผ๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜, 1๋กœ๋งŒ ์ฑ„์›Œ์ง„ ์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 โ‰ค N โ‰ค 37, N์€ 3k ๊ผด)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

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

์ถœ์ฒ˜: https://www.acmicpc.net/problem/1780

ํ’€์ด

  1. n = 1์ผ ๋•Œ์—๋Š” ๊ทธ ๊ฐ’์ด ์ข…์ด ํ•œ ์žฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ans์— ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
  2. n = k์ผ ๋•Œ ์ „์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ’์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ๊ฐ™์€ ๊ฐ’์ด๋ฉด ๊ทธ๋Œ€๋กœ ๊ทธ ๊ฐ’์— ๋Œ€ํ•œ ans์— ๊ฐœ์ˆ˜ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
  4. ๋‹ค๋ฅด๋‹ค๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 9์žฅ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  5. ์ด ๋•Œ ์ธ๋ฑ์Šค์— ์ฃผ์˜ํ•œ๋‹ค.
#include <bits/stdc++.h>
using namespace std;
 
int ans[5];
int board[2200][2200];
void func(const int board[2200][2200], int n, int x, int y){
    int is_same = 1;
    int num = board[x][y];
    if(n==1) {
        ans[num+1]++;
        return;
    }
    for(int i = x; i < x+n; i++){  // ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋ƒฅ n์œผ๋กœ ๋‘๋ฉด n=3์ด๊ณ 
        for(int j = y; j < y+n; j++){ // x๋‚˜ y๊ฐ€ 3๋ณด๋‹ค ํฌ๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ๊ทธ๋ƒฅ ์ง€๋‚˜์นœ๋‹ค.
            if(num == board[i][j]) continue;
            is_same = 0;
            break;
        }
        if(is_same == 0) break;
    }
    if(is_same == 1){
        ans[num+1]++;
        return;
    }
    for(int i = x; i < x+n; i += n/3){
        for(int j = y; j < y+n; j += n/3){
            func(board, n/3, i, j);
        }
    }
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> board[i][j];
        }
    }
    func(board, n, 0, 0);
    cout << ans[0] << endl;
    cout << ans[1] << endl;
    cout << ans[2] << endl;
}