https://www.acmicpc.net/problem/1992
이 문제는 재귀로 쉽게 해결할 수 있습니다.
문제 해결 순서는
1. 해당 범위의 값이 같은지 확인한다.
2. 1에서 같으면 그 값을 출력한다.
3. 1에서 다르면 '('를 출력하고 재귀를 통해 해당 영역을 4개로 나눈다.
4. 재귀로 들어가서 1 ~ 3까지 순서를 반복한다.
5. 재귀호출이 끝나고 ')'를 출력한다.
풀 코드입니다.
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> #include <algorithm> #include <stack> #include <string> using namespace std; #define ll long long #define MOD ((int)1e9 + 9) #define MAX_SIZE (int)1e5 #define mp make_pair #define INF 987654321 #define pii pair<int, int> //ios::sync_with_stdio(false); cin.tie(0); char map[1 << 6][1 << 6 + 1]; bool isSame(int x1, int y1, int x2, int y2) { char tmp = map[x1][y1]; for (int i = x1; i <= x2; i++) { for (int j = y1; j <= y2; j++) { if (tmp != map[i][j]) return 0; } } return 1; } void f(int x1, int y1, int x2, int y2) { if (isSame(x1, y1, x2, y2)) cout << map[x1][y1]; else { cout << '('; int midX = (x1 + x2) / 2; int midY = (y1 + y2) / 2; f(x1, y1, midX, midY); f(x1, midY + 1, midX, y2); f(midX + 1, y1, x2, midY); f(midX + 1, midY + 1, x2, y2); cout << ')'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) cin >> map[i]; f(0, 0, n - 1, n - 1); return 0; } | cs |
'알고리즘 > 구현' 카테고리의 다른 글
[12841] 정보대 등산 (0) | 2017.08.23 |
---|---|
[1700] 멀티탭 스케줄링 (0) | 2017.08.01 |
[14488] 준오는 급식충이야! (0) | 2017.07.29 |
[1913] 달팽이 (0) | 2017.07.27 |
[14649] 문홍안 (0) | 2017.07.27 |