백준 문제풀이

2448. 별 찍기 - 11 (자바, Java)

뮤츠 2022. 10. 1. 22:56

단계별 풀이에 있는 문제는 아니었지만, 저번 문제를 거의 베끼다시피했기 때문에, 제대로 이해했나 확인하기 위해 비슷한 난이도와 패턴의 문제를 풀어보았다.

차분하게 설계하면 쉬운데, 그냥 화면을 쳐다보며 생각한게 패인이라 여겼기에, 이번엔 종이와 펜을 들고 설계하였다. 그 결과 성공!! 덕분에 재귀에 대한 자신감을 얻을 수 있었다.

 

자세한 설명을 위해서는 그림자료가 좀 필요한데, 편집에는 자신이 없어서...그냥 말로 대충 떄워본다면,

n은 세로의 줄 수를 의미한다. 첫 세줄에 있는 삼각형의 패턴이, 높이가 2배씩 늘어날수록 반복되는

전형적인 재귀함수의 형태를 띈다. 앞선 문제에서는 초기값을 n=1로 설정했으나, 이번 문제에서는 그렇게 풀기엔 좀 복잡한 모양이라 생각해서, n=3으로 설정하여 세줄짜리 삼각형 모양을 기본값으로 설정하고, 6이상부터는 n을 반씩 쪼개서 재귀호출하다가 n=3일때 삼각형 그려서 완결짓는 형태를 생각했다.

 

재귀함수 매소드는 맨 왼쪽 상단의 시작점을 기준으로 좌표를 받았고, n값을 포함하여 star(n, x, y) 식으로 받았다.

따라서 함수가 제대로 만들어졌다면, star(n, 0, 0)을 호출하면 문제는 해결된다.

 

n=3일때 가로는 5, n=6일때 11, n=12일때 23...2n-1의 형태이고,

n=3일때는 star(3,0,0) 하나 호출하고 끝고 초기값이므로, if (n==3)으로 다 그려준다. 어차피 몇 안됨.

n=6 이상일때는 star(3,x,y)가 3가지 그려져야 한다. 그 3가지 좌표의 규칙을 n과의 관계성을 찾아내면 된다. 헷갈린다면 n=6일때, n=12일때를 각각 매칭시켜서 규칙성을 찾아보자.

 

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

public class Main {
	
	static char star[][];
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		star = new char[n][2*n-1];
		star(n, 0, 0);
		
		StringBuilder sb = new StringBuilder();
		
		for (int i=0; i<n; i++) {
			for (int j=0; j<2*n-1; j++) {
				if (star[i][j]=='*') {
					sb.append("*");
				} else {
					sb.append(" ");
				}
			}
			sb.append("\n");
		}
		
		System.out.println(sb);
				
	}
	
	static void star(int n, int x, int y) {
		
		if (n==3) {
			star[x][y+2] = '*';
			star[x+1][y+1] = '*';
			star[x+1][y+3] = '*';
			
			for (int i=0; i<2*n-1; i++) {
				star[x+2][y+i] = '*';
			}
			return;
		} else {
			star(n/2, x, y+n/2);
			star(n/2, x+n/2, y);
			star(n/2, x+n/2, y+n);
		}		
	}
}