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와 같은 방법으로 입력받는 방식만 조금 다르다.
'공부하자 > 알고리즘' 카테고리의 다른 글
[백준] 10870번 피보나치 수 5 C, java (0) | 2022.01.19 |
---|---|
[백준] 1316번 그룹 단어 체커 C (0) | 2022.01.15 |
[백준] 5622번 다이얼 C, java (0) | 2022.01.13 |
[백준] 2908번 상수 C, java (0) | 2022.01.13 |
[백준] 1541번 잃어버린 괄호 C (0) | 2022.01.11 |