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);
}
}
'JAVA > Coding Test' 카테고리의 다른 글
[JAVA] 백준 15894 수학은 체육과목 입니다_기하 (0) | 2023.03.23 |
---|---|
[JAVA] 백준 27323 직사각형_기하 (0) | 2023.03.23 |
[JAVA] 백준 2580 스도쿠_백트래킹 (0) | 2023.03.22 |
[JAVA] 백준 9663 N-Queen_백트래킹 (0) | 2023.03.17 |
[JAVA] 백준 15650 N과M(2)_백트래킹 (0) | 2023.03.16 |