본문 바로가기

코딩/알고리즘

백준 1780 종이의 개수

#include <iostream> #include <algorithm> using namespace std; int paper[2188][2188]; int n; int result[3]; //-1, 0, 1 void consoleInput() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &paper[i][j]); } } return; } int checkSameNum(int i_begin, int i_end, int j_begin, int j_end) { int start; start = paper[i_begin][j_begin]; for (int i = i_begin; i <= i_end; i++) { for (int j = j_begin; j <= j_end; j++) { if (paper[i][j] != start) { return -2; } } } return start; } void solve(int i_begin, int i_end, int j_begin, int j_end) { int sameNum = checkSameNum(i_begin, i_end, j_begin, j_end); if (sameNum == -2) { int length = (i_end - i_begin + 1) / 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { solve(i_begin + i * length, i_begin + i * length + length - 1, j_begin + j * length, j_begin + j * length + length - 1); } } } else { result[sameNum + 1]++; } } int main() { consoleInput(); solve(0, n - 1, 0, n - 1); for (int i = 0; i < 3; i++) cout << result[i] << endl; return 0; }


checkSameNum() : 구간 내의 숫자들이 동일한지, 동일하다면 그 숫자가 무엇인지 반환하는 함수


solve()함수를 재귀적으로 풀어서 계산



아이디어도 단순하고 구현도 단순한 문제..





'코딩 > 알고리즘' 카테고리의 다른 글

백준 2740 행렬 곱셈  (0) 2017.06.05
백준 6549 히스토그램에서 가장 큰 직사각형  (0) 2017.06.05
백준 11004 K번째 수  (0) 2017.06.02
[C#] 백준 2749 피보나치수 3  (0) 2017.05.28
백준 9252 LCS2  (0) 2017.05.27