1 minute read

별 찍기 - 19

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 차례대로 별을 출력한다.

# 예제 입력 1 
1
# 예제 출력 1 
*
# 예제 입력 2 
2
# 예제 출력 2 
*****
*   *
* * *
*   *
*****
# 예제 입력 3 
3
# 예제 출력 3 
*********
*       *
* ***** *
* *   * *
* * * * *
* *   * *
* ***** *
*       *
*********
# 예제 입력 4 
4
# 예제 출력 4 
*************
*           *
* ********* *
* *       * *
* * ***** * *
* * *   * * *
* * * * * * *
* * *   * * *
* * ***** * *
* *       * *
* ********* *
*           *
*************

생각한 알고리즘

  • 길이 및 재귀 시작 좌표 규칙은 다음과 같다.
# 최대 변 길이 (입력 N 이 들어 왔을 때)
N : 1 -> 1
N : 2 -> 5
N : 3 -> 9
N : 4 -> 13
# 4*(n-1) + 1


# 시작좌표 (입력이 3이 들어 왔을 때)
3 : 0.0
2 : 2,2
1 : 4,4
# 2(N-n), 2(N-n)

  • i번째에 해당하는 테두리가 * 인 직사각형을 그려내고
  • i-1 번째 함수를 호출한다.

답안 코드

#include <iostream>

using namespace std;
char arr[450][450];
int N;
void recur(int leng)
{
    int st = 2*(N-leng); 

    for(int i = st; i < st + 4 * (leng-1) +1 ; i++)
    {
        for(int j = st; j < st + 4 * (leng-1) +1 ; j++)
        {
            if(i == st || i ==  st + 4 * (leng-1))
            {
                arr[i][j] = '*';
            }
            else if(j == st || j == st + 4*(leng-1))
            {
                arr[i][j] = '*';
            }

        }
    }
    if(1 < leng)
        recur(leng-1);
}

int main(void)
{

    cin>>N;
    for(int i = 0; i < 4 * (N-1) +1 ; i++)
    {
        for(int j = 0; j < 4 * (N-1) +1 ; j++)
        {
            arr[i][j] = ' ';
        }
    }
    recur(N);
    for(int i = 0; i < 4 * (N-1) +1 ; i++)
    {
        for(int j = 0; j < 4 * (N-1) +1 ; j++)
        {
            printf("%c",arr[i][j]);
        }
        printf("\n");
    }
    
}