백준 4779 칸토어 집합

리진아·2025년 6월 12일

백준 풀이

목록 보기
10/10


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

전체 집합이 유한이라고 가정하고, 다음과 같은 과정을 통해서 칸토어 집합의 근사를 만들어보자.

  1. -가 3N개 있는 문자열에서 시작한다.

  2. 문자열을 3등분 한 뒤, 가운데 문자열을 공백으로 바꾼다. 이렇게 하면, 선(문자열) 2개가 남는다.

  3. 이제 각 선(문자열)을 3등분 하고, 가운데 문자열을 공백으로 바꾼다. 이 과정은 모든 선의 길이가 1일때 까지 계속 한다.

예를 들어, N=3인 경우, 길이가 27인 문자열로 시작한다.

---------------------------
여기서 가운데 문자열을 공백으로 바꾼다.

--------- ---------
남은 두 선의 가운데 문자열을 공백으로 바꾼다.

--- --- --- ---
한번 더

- - - - - - - -
모든 선의 길이가 1이면 멈춘다. N이 주어졌을 때, 마지막 과정이 끝난 후 결과를 출력하는 프로그램을 작성하시오.

입력
입력을 여러 줄로 이루어져 있다. 각 줄에 N이 주어진다. 파일의 끝에서 입력을 멈춘다. N은 0보다 크거나 같고, 12보다 작거나 같은 정수이다.

출력
입력으로 주어진 N에 대해서, 해당하는 칸토어 집합의 근사를 출력한다.

예제 입력
0
1
3
2

예제 출력
-
- -
- - - - - - - -
- - - -


public class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
		
		int N=0;
		for(int i=0; in.hasNextLine(); i++){
		    N=in.nextInt();
		    int su=1;
		    for(int k=0; k<N; k++){
		        su = 3*su;
		    }
		    
		    char[] result = new char[su];
            for (int j = 0; j < su; j++) {
                result[j] = '-';
            }
            
            // 재귀 함수 호출
            cantor(result, 0, su);
            
            System.out.println(new String(result));

		}
	}
	
	 // 재귀적으로 가운데를 공백으로 만드는 함수
    public static void cantor(char[] arr, int start, int length) {
        if (length < 3) return; //3미만이면 더이상 나눌 수 없음

        int third = length / 3; //3등분할 길이를 먼저 계산함
        
        // 가운데 구간(start + 1/3 ~ start + 2/3)을 공백으로 바꿈
        for (int i = start + third; i < start + 2 * third; i++) {
            arr[i] = ' ';
        }

        // 양쪽 재귀 호출
        cantor(arr, start, third); // 왼쪽 1/3 구간 재귀
        cantor(arr, start + 2 * third, third); // 오른쪽 1/3 구간 재귀
    }
    
}
profile
이것저것 개발 블로그

0개의 댓글