문제 링크 - 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'와 같이 한글자만 바꾸는게 안돼서 함수를 찾아보았는데
StringBuilder
의 setCharAt
을 통해 한글자만 변환이 가능했다.
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;
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);
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) {
return;
}
int newSize=size/3;
for(int i=start+newSize; i<start+2*newSize; i++) {
answer.setCharAt(i, ' ');
}
func(start, newSize);
func(start+2*newSize, newSize);
}
}