반응형
https://www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
[ 문제풀이 ]
분할 정복을 통해서 문제를 풀었습니다.
1. 원하는 부분의 숫자가 모두 같은 지 판단합니다.
2. 숫자가 다르다면 다시 9구역으로 나누어 1번을 반복합니다.
3. 숫자가 같다면 ans 배열에 1을 더해줍니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include<iostream> using namespace std; int N; int arr[2200][2200]; int ans[3]; void conquer(int y1, int y2, int x1, int x2) { int flag = 0; int cur = arr[y1][x1]; for (int i = y1; i < y2; i++) { //모두 같은 수인지 for (int j = x1; j < x2; j++) { if (cur != arr[i][j]) { flag = 1; break; } } } int y = (y2 - y1) / 3; int x = (x2 - x1) / 3; if (flag == 0) { //같은 수라면 ans[cur + 1]++; } else { //다른 수가 있다면 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { conquer(y1 + y * i, y1 + y * (i + 1), x1 + x * j, x1 + x * (j + 1)); } } } } int main() { scanf("%d", &N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &arr[i][j]); } } conquer(0, N, 0, N); for (int i = 0; i < 3; i++) { printf("%d\n", ans[i]); } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 11286번 - 절댓값 힙 (C++) (0) | 2022.08.23 |
---|---|
[ 백준 ] 3176번 - 도로 네트워크 (C++) (0) | 2022.08.22 |
[ 백준 ] 1931번 - 회의실 배정 (C++) (0) | 2022.08.20 |
[ 백준 ] 11047번 - 동전 0 (C++) (0) | 2022.08.19 |
[ 백준 ] 14889번 - 스타트와 링크 (C++) (0) | 2022.08.18 |