๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 1780๋ฒˆ - ์ข…์ด์˜ ๊ฐœ์ˆ˜

by dkswnkk 2022. 10. 5.

๋ฌธ์ œ

 

1780๋ฒˆ: ์ข…์ด์˜ ๊ฐœ์ˆ˜

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

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <cmath>
using namespace std;

int map[2188][2188];
bool visited[2188][2188];
int N;

int cnt[3];
bool check(int r, int c, int div){
    int cmp = map[r][c];
    for(int i=r; i<r+div; i++){
        for(int k=c; k<c+div; k++){
            if(map[i][k] != cmp) return false;
        }
    }
    return true;
}

void go(int r, int c, int div){
    if(check(r,c, div)){
        cnt[map[r][c] + 1] ++;
    }
    else{
        int size = div / 3;
        for(int i=0; i<3; i++){
            for(int k=0; k<3; k++){
                go(r+size*i, c+size*k, size);
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N;
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            cin>>map[i][k];
        }
    }
    go(0,0,N);
    
    cout<<cnt[0]<<'\n'<<cnt[1]<<'\n'<<cnt[2];
}

 

ํ’€์ด

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

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

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

void go(int r, int c, int div){
    if(check(r,c, div)){	// ์ข…์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ฐฏ์ˆ˜ ์นด์šดํŒ…
        cnt[map[r][c] + 1] ++;
    }
    else{	// ์•„๋‹ˆ๋ผ๋ฉด ์ž๋ฅธ๋‹ค.
        int size = div / 3;
        for(int i=0; i<3; i++){
            for(int k=0; k<3; k++){
                go(r+size*i, c+size*k, size);
            }
        }
    }
}

์‚ฌ์‹ค์ƒ ์œ„ ๋กœ์ง์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ ๋กœ์ง์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • N์ด 3^k๊ผด๋กœ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ข…์ด๋ฅผ ์ž๋ฅด๋Š” 2๋ฒˆ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค 3์œผ๋กœ ๋‚˜๋ˆˆ ํฌ๊ธฐ๋งŒํผ ์ž๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ–‰๊ณผ ์—ด์„ ๊ฐ๊ฐ ์„ธ ๋ฒˆ์”ฉ ์ด 9๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ go(r+size*i, c+size*k, size); ํ˜•์‹์œผ๋กœ ์ž˜๋ผ์ฃผ๊ฒŒ ๋˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€