Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 안드로이드
- 동적계획법
- cos pro
- 코드품앗이
- vuejs
- cos pro 1급
- C++
- DFS
- 안드로이드스튜디오
- 분할정복
- Vue
- django
- DFS와BFS
- issue
- BAEKJOON
- 코테
- Flutter
- 동적계획법과최단거리역추적
- 코딩테스트
- Python
- 백준
- AndroidStudio
- android
- 알고리즘
- codingtest
- Algorithm
- cos
- DART
- 파이썬
- 개발
Archives
- Today
- Total
Development Artist
[Beakjoon, C++] 2630번 : 색종이 만들기 본문
728x90
반응형
백준 단계별 풀기에서 분할정복 첫번째 문제이다.
링크는 아래와 같다.
1. 분할정복 문제는 재귀함수를 활용하는 것이다. 문제를 직면했을 때, 그것을 쪼개갠 작은 문제들을 해결한다면 그 문제들의 해결이 곧 그 문제의 해결이라는 것이다. 아래의 그림을 보자. 이번 문제에서 큰 사각형으로 바라본다면 사각형 안에 파란색, 하얀색 두가지가 섞여 있을 것이다. 하지만, 다음과 같이 쪼개고 쪼개다 보면, 결국 한가지의 색만 가지는 사각형을 얻을 수 있을 것이다.
2. 어떤식으로 재귀함수를 전개할 것인가.
함수의 기능은 배열전부가 하얀색이면 하얀색 카운트, 배열전부가 파란색이면 파란색 카운트, 그렇지 않다면, 사각형을 쪼개서 함수에 넣기.
프로그래밍적으로, 함수func가 있다. func는 2중 for문으로 2차원 배열(NxN) index 전부를 읽어서, 읽은 값이 0이면 하얀색 count, 1이 N^2개이면 전부 파란색이라는 뜻이니까 파란색 count, 0과 N^2 사이값이면 파란색 하얀색 섞여 있는 것이니까 N/2해서 func(N/2)로 다시 func를 call 한다.
#include<iostream>
using namespace std;
int paper[129][129];
int whitePaper = 0;
int bluePaper = 0;
void paperColorDecisionByDivdeConquer(int x, int y, int N) {
int tempBlueCount = 0; //
//2중 for문으로 0인지 1인지 탐색
for (int i = x; i < x + N; i++) {
for (int j = y; j < y + N; j++) {
if (paper[i][j]) { //파란색일때
tempBlueCount++; // 파란색 개수 count
}
}
}
if (!tempBlueCount) whitePaper++; // 하얀색
else if (tempBlueCount == N * N) bluePaper++; // 파란색
else { // 쪼갬
paperColorDecisionByDivdeConquer(x, y, N / 2); // 왼쪽 위 사각형
paperColorDecisionByDivdeConquer(x, y + N / 2, N / 2); // 오른쪽 위 사각형
paperColorDecisionByDivdeConquer(x + N / 2, y, N / 2); // 왼쪽 아래 사각형
paperColorDecisionByDivdeConquer(x + N / 2, y + N / 2, N / 2); // 오른쪽 아래 사각형
}
return;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> paper[i][j];
}
}
paperColorDecisionByDivdeConquer(0, 0, n);
cout << whitePaper << "\n";
cout << bluePaper;
return 0;
}
이상으로 분할정복 첫 번째 문제를 마치겠다.
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, C++] 1780번 : 종이의 개수 (0) | 2021.01.23 |
---|---|
[Baekjoon, C++] 1992번 : 쿼드트리 (0) | 2021.01.22 |
[Beakjoon, C++] 5430번 : AC (0) | 2021.01.19 |
[Baekjoon, C++] 1021번 : 회전하는 큐 (0) | 2021.01.17 |
[Baekjoon, C++] 10866번 : 덱 (0) | 2021.01.16 |
Comments