JAVA/Coding Test

[JAVA] 백준 4779 컨토어집합_재귀함수

오늘도개발 2023. 3. 22. 15:25

https://www.acmicpc.net/problem/4779

 

4779번: 칸토어 집합

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

www.acmicpc.net

 

 접근 : 

 

 - n 을 입력받는다.

 

 -  3^n 크기 만큼 - 문자를 연결한다.

 

 -  연결한 문자열을 1/3 ~ 2/3 길이 만큼 잘래내서 공백으로 바꾼다.

 

 - 앞 부분 0 ~ 1/3, 뒷부분 2/3 ~ n^3 에 대해서 같은 과정을 반복한다.

 

 - 1/3의 길이가 1 이하가 되면 더 이상 실행 할 수 없으므로 종료한다.

 

 코드 구현 : 

 

import java.io.*;

public class Main {

	static class Cantor {
		private int length;
		private StringBuilder sb = new StringBuilder();

		public Cantor(int n) {
			this.length = (int) Math.pow(3, n);
			this.makeStr();
			doCantor(0, this.length);
		}

		// 3^n 만큼 - 문자 연결
		public void makeStr() {
			for (int i = 0; i < this.length; i++) {
				this.sb.append('-');
			}
		}

		void doCantor(int start, int wide) {
			// wide가 1 이하이면 종료
			if (wide <= 1) {
				return;
			}

			// 다음 wide에 해당하는 wide/3
			int wide_per_three = wide / 3;

			// 1/3 부터 2/3 까지 공백으로 채움
			for (int i = start + wide_per_three; i < start + (2 * wide_per_three); i++) {
				this.sb.setCharAt(i, ' ');
			}

			// 앞부븐 1/3 에 대하여 같은 과정 반복
			this.doCantor(start, wide_per_three);

			// 뒷부분 2/3 에 대하여 같은 과정 반복
			this.doCantor(start + (2 * wide_per_three), wide_per_three);
		}

		StringBuilder getResult() {
			return this.sb;
		}

	}

	public static void main(String[] srgs) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input;
		StringBuilder sb = new StringBuilder();

		// null 이 입력될때 까지 반복
		while ((input = br.readLine()) != null) {
			sb.append(new Cantor(Integer.parseInt(input)).getResult()).append("\n");
		}
		// 결과 출력
		System.out.println(sb);
	}
}