출처 : https://www.acmicpc.net/problem/1780
종이의 개수 성공 풀이
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 3037 | 1811 | 1415 | 60.626% |
문제
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이 때 다음의 규칙에 따라 자르려고 한다.
- 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
- (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.
이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 N(1≤N≤3^7, N은 3^k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.
출력
첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.
예제 입력
9 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 -1 0 1 -1 0 1 -1 0 -1 1 0 1 -1 0 1 -1 0 1 -1 1 0 -1 0 1 -1
예제 출력
10 12 11
힌트
출처
- 문제를 만든 사람: author5
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 54 55 56 | #include <iostream> using namespace std; int** paper; int minus_paper = 0, zero_paper = 0, one_paper = 0 ; void find(int start_x, int start_y, int size) { //cout << "x = " << start_x << " y = " << start_y << " size " << size << endl; // 크기가 1이면 if (size == 1) { if (paper[start_x][start_y] == -1) minus_paper++; else if (paper[start_x][start_y] == 0) zero_paper++; else if (paper[start_x][start_y] == 1) one_paper++; return; } for( int i = start_x ; i < start_x+size ; i++) for (int j = start_y; j < start_y+size; j++) { // 요소가 하나라도 다르면 바로 자식 함수 생성 if (paper[start_x][start_y] != paper[i][j]) { for( int z = 0 ; z < 3 ; z++) for ( int r = 0; r < 3 ; r++) find(start_x + (size / 3)*z , start_y + (size / 3)*r, size / 3); return; } } // 요소가 전부 다 같으면 추가해주기 if (paper[start_x][start_y] == -1) minus_paper++; else if (paper[start_x][start_y] == 0) zero_paper++; else if (paper[start_x][start_y] == 1) one_paper++; return; } int main() { int total_size; cin >> total_size; // 2차원 배열 동적 생성 paper = (int**)malloc(sizeof(int*)*total_size); for (int i = 0; i < total_size; i++) paper[i] = (int*)malloc(sizeof(int)*total_size); // 정보 입력 for (int i = 0; i < total_size; i++) for (int j = 0; j < total_size; j++) cin >> paper[i][j]; find(0, 0, total_size); cout << minus_paper << endl << zero_paper << endl << one_paper; return 0; } | cs |