2-4.칸토어 함수

김현우·2024년 5월 9일
0

자료구조

목록 보기
7/12
post-thumbnail

문제

결국 중앙 쪼개기 -> 3등분 -> 하나씩 잡고 똑같이 중앙쪼개기 -> 3등분을 반복하면 된다.

종료조건은 쪼갤것이 없을때가 되고 그전까지는 재귀적으로 처리가 가능하다.

풀이과정

매번 별찍기 또는 칸토어 함수만 만나면 그냥 GG를 치고 풀지 않았었다.
오늘은 처음 도전이였다.

처음에 문제가 원하는 구조를 분석해보고자 하였다.

처음에는 3^(N-1)~2*3^(N-1)을 비우고
그다음부터는 3^(N-2)~2*3^(N-2)을 비우고 옆칸 넘어가는 식으로 3번
그다음은 3^(N-3)~2*3^(N-3)씩 3^2번 반복하는 식이였다.

결국 마지막에 가면 중앙의 한칸을 3^(N-1)번 반복해서 비우는 꼴이 될것이다.

답안

import java.util.Scanner;

public class Cantor{

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//입력받을 sc선언
        Cantor ct=new Cantor();//ct는 Cantor의 CantorFunc을 사용하기 위함

        while (sc.hasNextInt()) {
            int N=get_3_Squared(sc.nextInt());//x을 입력받고 3의 x제곱수 리턴받아 N에 저장
        
            String CantorStr=ct.CantorFunc("-".repeat(N), N, N);//N만큼 "-"로 된 문자열 저장

            System.out.println(CantorStr);
        }
    }

    public static int get_3_Squared(int number) {
		int result=1;

        for(int i=0;i<number;i++) result*=3;

        return result;
	}

    public String CantorFunc(String str,int N,int base){
        StringBuilder sb=new StringBuilder(str);//setCharAt으로 한글자씩 바꾸기위해 sb선언 및 초기화
        int tmp=base/N;//tmp는 전체 반복횟수
        int x=N/3;//얼만큼 뛸지
        if(N==1)
            return sb.toString();
        else
            {
                for(int i=0;i<tmp;i++)//전체 문자열을 tmp번 쪼개서 각각 중앙을 팔 준비
                    for(int j=x+N*i;j<2*x+N*i;j++){//쪼갠 문자열의 중앙부분을 ' '로 대체
                        sb.setCharAt(j, ' ');
                    }
                    
                    return CantorFunc(sb.toString(), N/3, base);
            }

    }
}

다른사람들을 보면 다른 부분도 재귀로 구현했지만 나는 아직 이정도밖에 생각이 안났다..
profile
학생

0개의 댓글