본문 바로가기
백준(C언어)/23년 1월

재귀 - 2447번

by C0MPAS 2023. 1. 9.

1월 9일(월) - 재귀(2447번)

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

   -> j
      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
i  0
   1    x     x     x     
   2
   3        x x x
   4    x   x x x   x
   5        x x x
   6
   7    x     x     x
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26

최초 생각 정리

 

- 세로는 i , 가로는 j 를 for 문을 이용해서 카운팅

- 안쪽 j의 for 문이 종료될때마다 \n을 넣어서 줄 바꿈

- j의 for 문에서는 함수의 첫 호출을 하고, 위쪽 함수 안에서는 다시 함수를 호출하며 재귀의 형태로 진행

- 3x3에서는 가운데에 (1,1) 자리에만 "빈 칸"이 생김

- 9x9에서 "빈 칸"이 생기는 곳을 x로 표시해보니 1,4,7인 곳에서 공통적으로 빈 칸이 생김

--> (1,1) (1,4) (1,7) (7,1) (7,4) (7,7) 의 테두리에서 빈 칸이 생김

--> [ (i/n)%==1 이면서 (j/n)%==1 ]인 경우에만 빈 칸을 찍는 조건을 만들고, 함수의 가장 후순위에서 재귀를 진행

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

1. 위의 생각을 토대로 코드를 작성한 이후, print_star 함수에서 최초 if 문 이후에 else 안에서 *를 찍고, 재귀를 진행

-> 3을 입력시 ** / 9를 입력시 *** / 27을 입력시 **** 처럼만 출력이 나옴

-> 추가적인 조건이 필요하다는 생각을 하게됨

-> n/3 == 0 일 경우에만 *를 출력하는 조건 추가

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>

void print_star(int i, int j, int n)
{
	if ( ((i/n) % 3 == 1) && ((j/n) % 3 == 1) )
	{
		printf(" ");
	}
	else
	{
		if (n / 3 == 0)
		{
			printf("*");

		}
		else
		{
			print_star(i, j, n / 3);
		}
	}
}

int main(void)
{
	int n;
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			print_star(i, j, n);
		}
		printf("\n");
	}

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 1월' 카테고리의 다른 글

브루트 포스 - 2231번  (0) 2023.01.11
브루트 포스 - 2798번  (0) 2023.01.10
재귀 - 11729번  (0) 2023.01.10
재귀 - 25501번  (0) 2023.01.07
정렬 - 18870번  (0) 2023.01.06

댓글