본문 바로가기
알고리즘/백준 문제풀이

백준 [java 자바] 2447번 : 별찍기-10

by 잔디🌿 2022. 8. 12.

     이 문제는 예전에도 도전해 본 적이 있는데 그때는 이걸 어떻게 푸나 하고 넘어갔지만 지금은 풀 수 있어서 기분이 좋았다. 확실히 꾸준히 하니 실력이 느는 것 같다. 이제까지는 실버 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

    여기 참고! 찾아보니 내가 제일 복잡하게 푼 것 같다