Dev.baelanche

[백준 10993] 별 찍기 - 18 본문

Data Structure & Algorithm/PS - JAVA

[백준 10993] 별 찍기 - 18

baelanche 2019. 6. 18. 21:58
반응형

 

입력된 수가 홀수 일때 정삼각형,

짝수 일때 역삼각형을 그리는 규칙을 가졌다.

 

삼각형은 외곽선만 존재하고 n 입력시 n-1, n-2, ... , (n>0일때까지) 를 재귀하며 내부에 삼각형을 그려야 한다.

 

문제 예제 출력 부분을 드래그 해보면 알 수 있을텐데 * 우측의 빈공간에는 공백이 없다.

k*k 형식으로 우측을 공백으로 채우면 출력형식 오류를 반환하니 우측의 공백은 없애주어야 한다.

 

코드 클린 작업을 하지 않아서 지저분하지만 삼각형을 그리는 부분은 대충 확인 가능할 것이다.

 

public class Main {

    static char a[][];
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int width = 1;
        int height = 1;
        int four = 4;
        int two = 2;
        for(int i=0; i<n-1; i++) {
            width += four;
            four *=2;
        }
        for(int i=0; i<n-1; i++) {
            height += two;
            two *= 2;
        }
        
        a = new char[height][width];
        
        for(int i=0; i<height; i++)
        	for(int j=0; j<width; j++)
        		a[i][j] = ' ';
        
        drawStar(0, 0, height, width, n);
        
        StringBuilder sb = new StringBuilder();
        if(n % 2 == 0) {
        	int k = 0;
	        for(int i=0; i<height; i++) {
	            for(int j=0; j<width-k; j++)
	                sb.append(a[i][j]);
	            sb.append("\n");
	            k++;
	        }
        } else {
        	int k = 1;
        	for(int i=0; i<height; i++) {
        		for(int j=0; j<width/2+k; j++)
        			sb.append(a[i][j]);
        		sb.append("\n");
        		k++;
        	}
        }
        System.out.println(sb.toString());
    }
    
    public static void drawStar(int s, int e, int hlen, int wlen, int seq) {
        if(seq <= 0) return;
        
        int mid = (s + s + wlen)/2;
        int left = s;
        int right = s + wlen;
        
        //삼각형
        if(seq % 2 == 1) {
            int innerLeft = mid;
            int innerRight = mid;
            for(int i=e; i<e + hlen; i++) {
                for(int j=innerLeft; j<=innerRight; j++) {
                    if(i == e || i == e + hlen-1 || j == innerLeft || j == innerRight)
                        a[i][j] = '*';
                    else
                    	a[i][j] = ' ';
                }
                innerLeft--;
                innerRight++;
            }
        }
        //역삼각형
        else {
            int innerLeft = left;
            int innerRight = right;
            for(int i=e; i<e + hlen; i++) {
                for(int j=innerLeft; j<innerRight; j++) {
                    if(i == e || i == e + hlen-1 || j == innerLeft || j == innerRight-1)
                        a[i][j] = '*';
                    else
                    	a[i][j] = ' ';
                }
                innerLeft++;
                innerRight--;
            }
        }
        
        int moveRight = s + (int)Math.pow(2, seq-1);
        if(seq % 2 == 1) drawStar(moveRight, e + hlen/2, hlen/2, wlen - (int)Math.pow(2, seq), seq-1);
        else drawStar(moveRight, e+1, hlen/2, wlen - (int)Math.pow(2, seq), seq-1);
    }
}

 

배열초기화를 안해주어서 영문도 모른체 틀렸습니다만 받고 있었는데

질문게시판에 올리니 초고수분이 3분만에 도와주었다...

반응형

'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글

[백준 문제집] N과 M 시리즈  (0) 2019.06.19
[백준 10997] 별 찍기 - 22  (0) 2019.06.19
[백준 10757] 큰 수 A+B  (0) 2019.06.18
[백준 1965] 상자넣기  (0) 2019.06.18
[백준 1309] 동물원  (0) 2019.06.18
Comments