Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어로 속이 빈 피라미드와 다이아몬드 패턴 출력하기

C 언어를 활용하면 별표(*)를 이용한 다양한 패턴을 콘솔에 출력할 수 있습니다. 일반적으로 꽉 찬(filled) 피라미드 패턴은 비교적 간단하게 만들 수 있지만, 속이 빈(hollow) 형태로 출력하려면 몇 가지 트릭이 필요합니다. 이 글에서는 속이 빈 피라미드와 속이 빈 다이아몬드 패턴을 생성하는 방법을 예제 코드와 함께 자세히 살펴보겠습니다.

속이 빈 피라미드(Hollow Pyramid)

속이 빈 피라미드의 구조는 다음과 같은 규칙을 따릅니다.

  • 첫 번째 줄에는 별표 1개를 출력합니다.
  • 마지막 줄에는 n개의 별표를 연속으로 출력합니다.
  • 나머지 줄에서는 줄의 시작과 끝에 정확히 별표 2개만 출력하고, 그 사이는 공백으로 채워 속이 빈 모양을 만듭니다.

즉, 각 줄마다 앞부분에 공백을 출력해 피라미드의 계단식 형태를 만들고, 첫 줄과 마지막 줄을 제외한 나머지 줄에서는 내부 공간을 공백으로 처리하는 것이 핵심입니다.

예제 코드

#include <stdio.h>
int main() {
    int n, i, j;
    printf("Enter number of lines: ");
    scanf("%d", &n);
    for(i = 1; i<=n; i++) {
        for(j = 1; j<=(n-i); j++){ // 별표 앞에 공백 출력
            printf(" ");
        }
        if(i == 1 || i == n){ // 첫 줄과 마지막 줄은 별표를 연속으로 출력
            for(j = 1; j<=i; j++) {
                printf("* ");
            }
        } else {
            printf("*"); // 각 줄의 시작 위치에 별표 출력
            for(j = 1; j<=2*i-3; j++) { // 속이 빈 부분을 공백으로 채움
                printf(" ");
            }
            printf("*"); // 각 줄의 끝 위치에 별표 출력
        }
        printf("\n");
    }
}

실행 결과

줄 수로 20을 입력했을 때의 출력 결과는 아래와 같습니다. 위쪽부터 한 개씩 시작해 점점 넓어지다가, 마지막 줄에서 전체 폭만큼 별표가 가득 찹니다.

Enter number of lines: 20
                    *
                   *   *
                  *     *
                 *       *
                *         *
               *           *
              *             *
             *               *
            *                 *
           *                   *
          *                     *
         *                       *
        *                         *
       *                           *
      *                             *
     *                               *
    *                                 *
   *                                   *
  *                                     *
 * * * * * * * * * * * * * * * *  * * *

속이 빈 다이아몬드(Hollow Diamond)

속이 빈 다이아몬드 패턴은 피라미드보다 조금 더 복잡합니다. 기본 규칙은 다음과 같습니다.

  • 첫 번째 줄과 마지막 줄에는 별표 1개씩만 출력합니다.
  • 나머지 줄에서는 줄의 시작과 끝에 별표 2개를 출력하고, 사이는 공백으로 채웁니다.

다이아몬드는 크게 상단(위쪽 절반)하단(아래쪽 절반), 두 부분으로 나눌 수 있습니다. 상단에서는 줄이 진행될수록 공백 개수를 늘려가며 넓어지고, 하단에서는 반대로 공백 개수를 줄여가며 좁혀집니다. 이를 처리하기 위해 중간 지점을 가리키는 변수 mid를 사용하면, 전체 줄 번호를 두 부분으로 나누어 깔끔하게 구현할 수 있습니다.

예제 코드

#include <stdio.h>
int main() {
    int n, i, j, mid;
    printf("Enter number of lines: ");
    scanf("%d", &n);
    if(n %2 == 1) { // n이 홀수이면 짝수로 만들기 위해 1 증가
        n++;
    }
    mid = (n/2);
    for(i = 1; i<= mid; i++) { // 상단(위쪽 절반) 부분
        for(j = 1; j<=(mid-i); j++){ // 별표 앞에 공백 출력
            printf(" ");
        }
        if(i == 1) {
            printf("*");
        } else {
            printf("*"); // 각 줄의 시작 위치에 별표 출력
            for(j = 1; j<=2*i-3; j++){ // 속이 빈 부분을 공백으로 채움
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }
    for(i = mid+1; i<n; i++) { // 하단(아래쪽 절반) 부분
        for(j = 1; j<=i-mid; j++) { // 별표 앞에 공백 출력
            printf(" ");
        }
        if(i == n-1) {
            printf("*");
        } else {
            printf("*"); // 각 줄의 시작 위치에 별표 출력
            for(j = 1; j<=2*(n - i)-3; j++) { // 속이 빈 부분을 공백으로 채움
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }
}

실행 결과

줄 수로 15를 입력하면 입력값이 자동으로 16으로 조정되어 대칭적인 다이아몬드가 완성됩니다. 맨 위에서 별표 하나로 시작해 점점 벌어졌다가, 중간 이후부터는 다시 좁아지며 맨 아래에서 별표 하나로 끝납니다.

Enter number of lines: 15
               *
              *   *
             *       *
            *         *
           *           *
          *             *
         *               *
        *                 *
         *               *
          *             *
           *           *
            *         *
             *       *
              *   *
               *

마무리

이처럼 반복문과 조건문을 적절히 조합하면 복잡해 보이는 속이 빈 패턴도 손쉽게 구현할 수 있습니다. 핵심은 각 줄의 공백 개수와 별표의 위치를 규칙화하는 것입니다. 이 예제를 응용하면 삼각형, 모래시계, 오른쪽 정렬 피라미드 등 다양한 변형 패턴도 직접 만들어 볼 수 있으니, 여러 입력값으로 실험해 보면서 원리를 익혀보시기 바랍니다.