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 | 31 |
Tags
- 분리집합
- 동적계획법
- 완전탐색
- Algospot
- DFS
- 너비우선탐색
- 종만북
- BFS
- 유니온파인드
- acm
- 문자열
- 알고스팟
- 다이나믹프로그래밍
- priority_queue
- 이분탐색
- 그리디
- 누적합
- 스택
- 백트래킹
- 재귀
- BOJ
- stack
- 분할정복
- Greedy
- 세그먼트트리
- backtracking
- 알고리즘문제해결전략
- union-find
- 백준
- DP
Archives
- Today
- Total
DAMPER's 낙서장
4779 칸토어 집합 본문
728x90
딱 실버 분할정복 문제.
'-'만 \( 3^{N} \)개 있는 문자열을 3등분으로 나누어 가운데 부분은 공백(space)로 바꾸고 왼쪽, 오른쪽은 다시 같은 작업을 반복하는 문제.
다음 그림과 같이 (부분)문자열의 첫번째 인덱스를 start로 하고, 3등분한 문자열의 오른쪽 부분의 첫번째 인덱스를 end 라고 하자.
size를 3등분된 문자열의 크기라고 할 때, end = start+size+size 라고 할 수 있다.
이 때, (부분)문자열의 인덱스 start+size 부터 end-1 까지 공백으로 바꾸어준다.
그리고 재귀적으로 오른쪽 부분, 왼쪽 부분을 각각 3등분하여 같은 작업을 반복한다.
이 작업을 3등분 할 수 없을 때까지 (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
|
#include <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
void divide_conquer(string& k, int size, int start)
{
if(size == 1) return;
size /= 3;
int end = start+size+size;
for(int i=start+size;i<end;i++)
k[i] = ' ';
divide_conquer(k, size, start);
divide_conquer(k, size, end);
}
int main()
{
cin.sync_with_stdio(NULL);
cin.tie(NULL);
cout.tie(NULL);
int n;
while(scanf("%d", &n) == 1)
{
string k = string((int)pow(3, n), '-');
divide_conquer(k, k.size(), 0);
cout << k << endl;
}
return 0;
}
|
cs |
728x90
'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글
11660 구간 합 구하기 5 (0) | 2021.05.14 |
---|---|
1238 파티 (0) | 2021.05.05 |
6064 카잉 달력 (0) | 2021.04.29 |
1202 보석 도둑 (0) | 2021.04.27 |
16928 뱀과 사다리 게임 (0) | 2021.04.26 |