πŸ• 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;
}

/*
 */
λ°˜μ‘ν˜•