이 문제는 예전에도 도전해 본 적이 있는데 그때는 이걸 어떻게 푸나 하고 넘어갔지만 지금은 풀 수 있어서 기분이 좋았다. 확실히 꾸준히 하니 실력이 느는 것 같다. 이제까지는 실버 1문 제 만 풀었는데 이제 골드 5로 넘어가고자 한다. 빨리 골드로 승급하고 싶다!
n은 3의 x제곱이고 x만큼 저 패턴을 반복한다고 보면 된다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int cnt = 0;
int nn = n;
while(nn != 1) {
nn/=3;
cnt ++;
}
char[][] arr = new char[n+1][n+1];
arr[1][1] = '*';
int i,j;
int k;
for(i= 0;i<cnt;i++) {
for(j =1 ;j<=Math.pow(3, i);j++) {
for(k = 1;k<=Math.pow(3, i);k++) {
arr[(int) (j +Math.pow(3, i))][k] = arr[j][k] ;
arr[(int) (j +2*Math.pow(3, i))][k] = arr[j][k] ;
arr[j][(int) (k+Math.pow(3, i))] = arr[j][k] ;
arr[j][(int) (k+(Math.pow(3, i)*2))] = arr[j][k] ;
arr[(int) (j +Math.pow(3, i))][(int) (k+Math.pow(3, i)*2)] = arr[j][k] ;
arr[(int) (j +Math.pow(3, i)*2)][(int) (k+Math.pow(3, i))] = arr[j][k] ;
arr[(int) (j +Math.pow(3, i)*2)][(int) (k+Math.pow(3, i)*2)] = arr[j][k] ;
}
}
}
for(i = 1;i<=n;i++) {
for(j = 1;j<=n;j++) {
if(arr[i][j] == '*') {
sb.append('*');}
else {
sb.append(' ');;
}
}
sb.append('\n');
}
System.out.println(sb);
}
}
i = 0부터 n-1까지 돌도록 했고 각 회마다 같은 블럭이 들어가야 하는 8군데를 채우도록 했다. 그리고 그냥 System... 이걸 이용해서 출력하면 시간 초과가 나서 stringBuilder을 이용하여 출력하였다.
처음 이 코드를 완성하고 출력했을 때 너무 아름다웠다. 기분이 좋은 문제같다(맞았을때만...)
알아야 할 점:
이렇게 출력할 것이 많은 것은 stringBuilder을 사용하도록 하기
다른 사람의 코드와 다른 점:
1. 빈칸의 i, j는 모두 0이 될 때까지 3으로 나누면 둘 다 나머지가 1인 배열이 빈칸이다.
2. 재귀 함수를 사용한다.
[백준] 2447번 : 별 찍기 - 10 with java – JOOS (joosjuliet.github.io)
[백준] 2447번 : 별 찍기 - 10 with java
문제: https://www.acmicpc.net/problem/2447
joosjuliet.github.io
여기 참고! 찾아보니 내가 제일 복잡하게 푼 것 같다
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준 [자바 java] 1495번 : 기타리스트 (0) | 2022.08.14 |
---|---|
백준 [java 자바] 1629번 : 곱셈 (0) | 2022.08.13 |
백준 [java 자바] 6588번 : 골드바흐의 추측 (0) | 2022.08.12 |
백준 [java 자바] 1074번 : Z (0) | 2022.08.11 |
백준 [java 자바] 1946번 : 신입사원 (0) | 2022.08.10 |