[백준10993] 별 찍기-18 /Java

Hyeongmin Jung·2022년 11월 27일
0

java

목록 보기
11/28

링크 | https://www.acmicpc.net/problem/10993

문제 |

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력 |

첫째 줄에 N(1 ≤ N ≤ 10)이 주어진다.

출력 |

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 |

Solution |

  • 재귀함수 사용.
  • N이 짝수면 역삼각형, 홀수면 삼각형을 그려야 한다.

cf) 출력 형식이 잘못되었습니다.
예시 결과값을 드래그해보면 각 줄의 마지막 별 이후의 공백은 출력하지 않는 것을 알 수 있다.

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

public class Star_18 {
	static char[][] star;
	static boolean even;
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		star = new char[row(N)][col(N)];
		for (int i=0; i<star.length; i++) {
			Arrays.fill(star[i],' ');
		}
		
		if (N%2==1) {
			Pattern(0 ,col(N)/2, N);
		}else {
			Pattern(row(N)-1 ,col(N)/2, N);
		}
		
		System.out.print(print(star, N));
		br.close();
	}
	
	static int row(int N){
		if(N==1) {return 1;}
		int r=1;
		for(int i=1; i<N; i++) {
			r = r*2+1;
		}
		return r;
	}
	static int col(int N){
		if(N==1) {return 1;}
		int c=1;
		for(int i=1; i<N; i++) {
			c = c*2+3;
		}
		return c;
	}

	static void Pattern(int row, int col, int N) {
		if (N%2==1) {
			if (N==1) {
				star[row][col] = '*';
				return;
			}
			
			star[row][col] = '*';
			for(int i=1; i<row(N)-1;i++) {
				star[row+i][col-i] = star[row+i][col+i] = '*';
			}
			for(int i=0; i<col(N);i++) {
				star[row+row(N)-1][i+col-col(N)/2] = '*';
			}
			
			Pattern(row+row(N)-2, col, N-1);
			return;
		}else{
			star[row][col] = '*';

			for(int i=1; i<row(N)-1;i++) {
				star[row-i][col-i] = star[row-i][col+i] = '*';
			}
			for(int i=col-col(N)/2; i<col+col(N)/2+1; i++) {
				star[row-row(N)+1][i] = '*';
			}
			
			Pattern(row-row(N)+2, col, N-1);
			return;
		}	
	}
	
	static StringBuilder print(char[][] star, int N) {
		StringBuilder sb = new StringBuilder();
		
		if(N%2==1) {
			for (int i = 0; i < star.length; i++) {
				for (int j = 0; j < star[0].length/2+i+1; j++) {
					sb.append(star[i][j]);
				}
				sb.append('\n');
			}
		}else {
			for (int i = 0; i < star.length; i++) {
				for (int j = 0; j < star[0].length-i; j++) {
					sb.append(star[i][j]);
				}
				sb.append('\n');
			}
		}

		return sb;
	}
}

0개의 댓글