하다보니

1780번-종이의 개수 본문

알고리즘 풀이/백준

1780번-종이의 개수

claire 2022. 2. 16. 15:27
n=int(input())
board=[]
num=[0]*3
for _ in range(n):
    board.append(list(map(int,input().split())))

def check(x,y,n):
    for i in range(x,x+n):
        for j in range(y,y+n):
            if board[x][y]!=board[i][j]:
                return False
    return True

def func(x,y,z):
    if check(x,y,z):
        num[board[x][y]+1]+=1
        return
    n=z//3
    for i in range(3):
        for j in range(3):
            func(x+n*i,y+n*j,n)
    
func(0,0,n)
for i in range(3):
    print(num[i])

- c++

/*
만약 종이가 모두 같은 수로 되어 있으면 이 종이 그대로 사용한다. 
같은 수로 되어 있지 않으면 종이 9개로 자르고, 각각의 잘린 종이에 대해 1의 과정을 반복한다. 
이와 같이 종이를 잘랐을 때 -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 
작성하라. 
*/
#include<bits/stdc++.h>
using namespace std;

int num[3];
int board[2200][2200];

bool check(int x,int y,int n) {
	for (int i = x; i < x+n; i++) {
		for (int j = y; j < y+n; j++) {
			if (board[x][y] != board[i][j])
				return false;
		}
	}
	return true;
}

void solve(int x, int y, int z) {
	if (check(x, y, z)) {
		num[board[x][y] + 1] += 1;
		return;
	}
	int n = z / 3;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			solve(x + n * i, y + n * j, n);
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];
		}
	}
	solve(0, 0, n);
	for (int i = 0; i < 3; i++) cout << num[i]<<'\n';
}

'알고리즘 풀이 > 백준' 카테고리의 다른 글

2630번-색종이 만들기  (0) 2022.02.18
6593번-상범 빌딩  (0) 2022.02.17
3015번-오아시스 재결합  (0) 2022.02.16
6198번-옥상 정원 꾸미기  (0) 2022.02.09
1074번-Z  (0) 2022.02.08