하다보니
1780번-종이의 개수 본문
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 |