DAMPER's 낙서장

4779 칸토어 집합 본문

Problem Solving/BOJ 문제풀이

4779 칸토어 집합

DAMPER 2021. 5. 5. 01:04
728x90

www.acmicpc.net/problem/4779

 

4779번: 칸토어 집합

칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다. 전체 집합이 유한이라고 가정하고,

www.acmicpc.net

 

딱 실버 분할정복 문제.

 

'-'만 \( 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 sizeint start)
{
    if(size == 1return;
    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, sizeend);
}
 
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