본문 바로가기

Problem Solving/백준BOJ

[백준BOJ] 16505번 별.java

728x90
반응형
SMALL

 

백준 저지에서 별을 자바를 통해 풀어 보았다. 

 

https://www.acmicpc.net/problem/16505

 

16505번: 별

출력 예제를 보고 별 찍는 규칙을 유추하여 별을 찍어 보자.

www.acmicpc.net

16505번 별.java

 

GitHub - tomy9729/Algorithm: 🐗 내가 직접 작성한 내 코드 🐗

🐗 내가 직접 작성한 내 코드 🐗. Contribute to tomy9729/Algorithm development by creating an account on GitHub.

github.com

 

 

16505번 별

문제

출력 예제를 보고 별 찍는 규칙을 유추하여 별을 찍어 보자.

설명

n번 째로 찍는 별은 n-1번 째로 찍은 별을 세 번 반복한 것과 같다. 이 부분은 그렇게 어렵지 않으나 다른 곳에서 문제가 생겼다.

 

모든 별을 반복문을 통해 돌아가면 바로 바로 찍어주었는데 이 때문에 100%에서 시간 초과가 발생하여 멘붕 상태에 빠졌다.

 

이는 출력은 반복시마다 해주어서 그런데 이보다는 출력할 대상들을 한 번에 출력해주는 것이 더 빠르다. StringBuilder를 통해 출력물들을 모아 한 번에 출력해주었더니 정답을 맞출 수 있었다.

 

추가로 문제 조건에 각 문장 끝에 있는 공백은 출력하지 않는다는 조건을 정확히 구현해야 정답을 맞출 수 있다. 

코드

//16505번 별.java
package week3;

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

public class 별_16505 {
	private static char star[][]; 
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int num=Integer.parseInt(bf.readLine()); 
		int size = (int) Math.pow(2, num);
		star = print_star(num+1,size*2);
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<size;i++) {
			for(int j=0;j<(size-i);j++) {
				sb.append(star[i][j]);							
			}sb.append("\n");
		}
		System.out.println(sb.toString().substring(0, sb.length()-1));
	}
	
	public static char[][] print_star(int num, int size) {
		char[][]star = new char[size][size];
		for(int i=0;i<size;i++) {
			Arrays.fill(star[i], ' ');
		} 
		if(num==0) {
			star[0][0]='*';
			return star;
		}
		
		char[][] pre_star = print_star(num-1,size/2);
		for(int i=0;i<size;i++) {
			for(int j=0;j<size;j++) {
				if(j<size-i) {
					star[i][j]=pre_star[i%(size/2)][j%(size/2)];
				}
			}
		}
		return star;
	}
}
728x90
반응형
SMALL