[백준/java] 4779. 칸토어 집합

somyeong·2022년 9월 27일
2

코테 스터디

목록 보기
24/52

문제 링크 - https://www.acmicpc.net/problem/4779

🌱 문제


🌱 풀이

  • 먼저 거듭제곱으로 최대 문자열 길이를 계산해 보았다.
  • N<=12 이므로 3^12 = 531,441 이니까 for문을 통해 '-'로 이루어진 문자열을 처음에 만들어 놓고, 가운데 부분을 공백으로 바꾸는 방법을 사용해서 풀었다.

알게 된 부분

  • 해당 문제처럼 테스트 케이스 갯수가 주어지지 않을 경우 java에서는 어떻게 처리해야할 지 몰랐다. 다음과 같이 while문 안에서 br.readLine()를 사용함으로써 더이상 입력이 들어오지 않을 때 까지 반복할 수 있었다.
String str;
while ((str = br.readLine()) != null) {
 }
  • 그리고 java에서는 s[i]='a'와 같이 한글자만 바꾸는게 안돼서 함수를 찾아보았는데 StringBuildersetCharAt을 통해 한글자만 변환이 가능했다.
  • String으로는 answer.charAt() 이 안됐다. 찾아보니 java에서 문자열은 immutable이라서 값을 바꿀 수 없다고 한다.
StringBuilder answer;
answer.setCharAt(i, ' '); // 여기서 " " 이 아니라 ' '인것 주의 

🌱 코드

package Sep_week04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 4779. 칸토어 집합 
public class boj_4779 {
	static int n;
	static StringBuilder answer;

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str;
		while ((str = br.readLine()) != null) {
			n = Integer.parseInt(str);
			answer =new StringBuilder();
			int len = (int) Math.pow(3, n);
            //길이가 3^n 이고 '-'로 이루어진 문자열 미리 만들어 놓고, 재귀함수 시작하기 
			for (int i = 0; i < len; i++) {
				answer.append("-");
			}
			
			func(0, len); // 시작 인덱스, 시작 길이
			System.out.println(answer);

		}
	}

	public static void func(int start,int size) { //시작 인덱스, 문자열 사이즈
		if(size==1) { //문자열 사이즈가 1이되면 리턴
			return;
		}
		int newSize=size/3;
        // 3등분한 문자열의 2번째 부분 공백처리
		for(int i=start+newSize; i<start+2*newSize; i++) {
			answer.setCharAt(i, ' ');
		}
		
		func(start, newSize); // 3등분한 문자열에서 첫번째 부분
		func(start+2*newSize, newSize); // 3등분한 문자열의 세번째 부분 
	}

}
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글