[백준2447] 별 찍기-10 / Java

Hyeongmin Jung·2022년 11월 25일
0

java

목록 보기
9/28

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

문제 |

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력 |

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력 |

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

예제 |

Solution |

  • 재귀함수 사용.
  • 가로, 세로 3씩 반복하면서 4번째 별을 찍을 공간은 빈공간이 찍히도록 한다.

cf) 시간초과가 발생할 경우
1. 출력 시 Println보다는 StringBuilder 이용.
sb.append("출력할 내용\n"); 이렇게 넣는 것보다 sb.append("출력할 내용").append('\n');와 같이 구현하는 것이 속도가 더 빠르다.
2. 입력 받을 시 Scanner보다 BufferedReader 이용.

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

public class Star_10 {
	static char[][] star;
	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[N][N];

		Pattern(0, 0, N, false);
		
		System.out.println(print(star));
		br.close();
	}
	
	static void Pattern(int row, int col, int size, boolean blank) {
		if (blank) {
			blank(row, col, size);
			return;
		}
		
		if (size==1) {
			star[row][col] = '*';
			return;
		}
		
		int cnt=0;
		int newsize = size/3;
		for(int i=row; i<row+size; i+=newsize) {
			for(int j=col; j<col+size; j+=newsize) {
				if(cnt==4) {
					Pattern(i, j, newsize, true);
				}else {
					Pattern(i, j, newsize, false);
				}
				cnt++;
			}
		}
	}
	
	static void blank(int row, int col,int size) {
		for(int i=row; i<size+row; i++) {
			for(int j=col; j<size+col; j++) {
				star[i][j]=' ';
			}
		}
	}
	
	static StringBuilder print(char[][] star) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < star.length; i++) {
			for (int j = 0; j < star.length; j++) {
				sb.append(star[i][j]);
			}
			sb.append('\n');
		}
		return sb;
	}
}

0개의 댓글