본문 바로가기
공부하자/알고리즘

[백준] 2447번 별 찍기-10 C, java

by snbrin 2022. 1. 13.

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

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

C

#include <stdio.h>


void starstemp(int i, int j, int n);

int main() {

	int n,i,j;

	scanf("%d", &n);	//N값 입력

	//행,열 n*n크기 정사각형 만들기
	for (i = 0; i < n; i++) {	//행
		for (j = 0; j < n; j++) {	//열
			starstemp(i, j, n);	//*을 찍는 함수 호출
		}
		printf("\n");	//한줄 다 찍으면 다음줄(다음행)로 넘어감
	}

	return 0;
}

//재귀 함수로 별 찍기
void starstemp(int i, int j, int n) {
	
	if ((i / n) % 3 == 1 && (j / n) % 3 == 1) {
		printf(" ");	//공백 찍기
	}
	else {
		if (n / 3 == 0) {	//n이 3보다 작은 경우(1,2일 때)
			printf("*");
		}
		else {
			starstemp(i, j, n / 3);	// 별을 찍거나 공백을 찍을 때까지 반복
		}
	}
}

재귀함수를 사용하여 별이나 공백을 찍을 때까지 반복하게 만든다.  공백인 부분은 (N/3) x (N/3) 크기의 정사각형 하나만 보았을 때, 5번째 자리이다. 때문에 (i/N)%3 을 했을 때 나머지가 1인 경우에 공백이어야 한다.

결과

 

java

package javastd1;

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


public class bj2447 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub

		int i,j;
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(bf.readLine());
		
		for(i=0; i<n; i++) {
			for(j=0;j<n; j++) {
				starstemp(i,j,n);
			}
			System.out.println('\n');
		}
		
		
	}
	
	static void starstemp(int i, int j, int n) {
		if((i/n)%3==1 && (j/n)%3==1) {
			System.out.println(" ");
		}
		else {
			if(n/3==0) {
				System.out.println("*");
			}
			else {
				starstemp(i,j,n/3);
			}
		}
		
	}

}

C와 같은 방법으로 입력받는 방식만 조금 다르다.