본문 바로가기
BOJ

[BOJ] [JAVA] 4779번 칸토어 집합

by Parsler 2024. 1. 14.
 

4779번: 칸토어 집합

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

www.acmicpc.net

재귀로 푸는 문제이다.

입력이 끝나는 위치가 없어서 BufferedReader를 통해 입력을 받아야 한다. 처음 알았다!

		String s;
		while ((s = br.readLine()) != null) {

길이가 3^n인 char 배열을 만들고 '-'로 채워 넣는다.

다음으로 kanto 메서드를 만들었다. kanto는 start(시작 지점)과 초기 length를 지정해준다.

가장 처음에는 시작 지점이 index = 0, length = 3 ^ n이다.

이후 length / 3만큼 가운데를 지우고 재귀를 통해 다음으로 넘어간다.

import java.io.*;

public class Main {

	static char [] ch;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringBuilder sb;
		
		String s;
		while ((s = br.readLine()) != null) {
			int n = Integer.parseInt(s);
			ch = new char[(int) Math.pow(3,  n)];
			for (int i = 0; i < ch.length; i++) {
				ch[i] = '-';
			}
			
			kanto(0, ch.length);
			sb = new StringBuilder();
			
			for (int i = 0; i < ch.length; i++) {
				sb.append(ch[i]);
			}
			System.out.println(sb);
		}
	}
	
	private static void kanto(int start, int len) {
		if (len < 3) return;
		
		int l = len / 3;
		
		for (int i = start + l; i < start + l * 2; i++) {
			ch[i] = ' ';
		}
		
		kanto(start, l);
		kanto(start + l * 2, l);
	}

}