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

C 언어로 대칭 이중 삼각형 패턴 출력하기

주어진 줄 수를 바탕으로 최소한의 복잡도로 대칭 이중 삼각형(symmetric double triangle) 패턴을 출력하는 것이 이번 문제의 목표입니다.

예시

입력: 5
출력:
        X
        X
       O X
      O X
   X O X O X
    X O
     X O
      X
       X

문제 접근 방식

전체 패턴은 크게 세 부분으로 나누어 생각할 수 있습니다.

  • 윗부분(상단): n이 홀수일 때는 n-1줄, 짝수일 때는 n-2줄을 출력합니다.

  • 중간 부분: n이 홀수일 때는 1줄, 짝수일 때는 3줄을 출력합니다.

  • 아랫부분(하단): n이 홀수일 때는 n-1줄, 짝수일 때는 n-2줄을 출력합니다.

알고리즘

START
    STEP 1: IF (n % 2 == 0) then
        x = x - 1;
        공백 개수 p = n – 1로 정의
        문자 개수 s = 1로 정의
    STEP 2: LOOP FOR i = 1 AND i <= (x - 1) / 2 AND i++
        LOOP FOR j = 1 AND j <= p AND j++
            공백 출력
        END LOOP
        IF i % 2 != 0 then
            STEP 11 Printx(s) 호출
        ELSE
            STEP 12 Printo(s) 호출
        END
        개행 출력
        p를 1 증가
        LOOP FOR j = 1 AND j <= p AND j++
            공백 출력
        END LOOP
        IF i % 2 != 0 then
            STEP 11 Printx(s) 호출
        ELSE
            STEP 12 Printo(s) 호출
        END IF
        개행 출력
        p를 1 감소
        s를 1 증가
    END LOOP
    STEP 3: IF n % 2 == 0 {
        LOOP FOR i = 1 AND i <= p AND i++
            공백 출력
            IF n % 4 != 0 then
                STEP 11 Printx(n/2) 호출
            ELSE
                STEP 12 Printo(n/2) 호출
            END IF
            공백 출력
        END IF
    STEP 4: IF n % 2 != 0 then
        Printx(n) 호출
        ELSE
            IF n % 4 != 0 then
                n을 2로 나눈 뒤 Printx(n/2) 두 번 호출
            ELSE
                Printx(n/2)와 Printo(n/2) 호출
            END IF
        END IF
        개행 출력
    STEP 5: IF n % 2 == 0 then {
        공백 출력
        Printx(n/2) 호출
        개행 출력
        END IF
    STEP 6: SET p = 1
    STEP 7: IF n % 2 == 0
        x를 1 감소
        SET p = 2
        END IF
    STEP 8: SET q = x / 2
    STEP 9: LOOP FOR i = 1 AND i <= x AND i++
        LOOP FOR j = 1 AND j <= p AND j++
            공백 출력
        END FOR
        STEP 11 Printx(q) 호출
        IF i % 2 == 0 THEN
            q를 1 감소
        END IF
        개행 출력
        p를 1 증가
    END FOR
    STEP 10: 개행 출력
    STEP 11: Printx(n)
        LOOP FOR i = 1 AND i <= n AND i++
            IF i % 2 != 0 then
                x 출력
            ELSE
                o 출력
            END IF
        END FOR
    STEP 12: Printo(n)
        LOOP FOR i = 1 AND i <= n AND i++
            IF i % 2 != 0 then
                o 출력
            ELSE
                x 출력
STOP

C 언어 구현 코드

#include <stdio.h>
// x로 시작하여 x와 o를 번갈아 출력하는 함수
int printx(int n) {
    int i;
    for (i = 1; i <= n; i++) {
        if (i % 2 != 0)
            printf("x ");
        else
            printf("o ");
    }
    return 0;
}
// o로 시작하여 o와 x를 번갈아 출력하는 함수
int printo(int n) {
    int i;
    for (i = 1; i <= n; i++) {
        if (i % 2 != 0)
            printf("o ");
        else
            printf("x ");
    }
    return 0;
}
// n에 대한 패턴을 출력하는 함수
int printpattern(int n) {
    // 윗부분
    // 홀수일 때는 n-1줄, 짝수일 때는 n-2줄
    int x = n;
    int i, j;
    if (n % 2 == 0)
        x = x - 1;
    // 각 줄에서 남겨둘 공백의 개수
    int p = n - 1;
    // 각 줄의 문자 개수
    int s = 1;
    // 반복할 때마다 두 줄씩 출력
    for (i = 1; i <= (x - 1) / 2; i++) {
        for (j = 1; j <= p; j++) {
            printf(" ");
        }
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
        printf("\n");
        p++;
        for (j = 1; j <= p; j++)
            printf(" ");
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
        printf("\n");
        p--;
        s++;
    }
    // 짝수일 때 추가되는 상단 중간 줄
    if (n % 2 == 0) {
        for (i = 1; i <= p; i++)
            printf(" ");
        if (n % 4 != 0)
            printx(n / 2);
        else
            printo(n / 2);
        printf("\n");
    }
    // 중간 줄
    if (n % 2 != 0)
        printx(n);
    else {
        if (n % 4 != 0) {
            printx(n / 2);
            printx(n / 2);
        } else {
            printx(n / 2);
            printo(n / 2);
        }
    }
    printf("\n");
    // 짝수일 때 추가되는 하단 중간 줄
    if (n % 2 == 0) {
        printf(" ");
        printx(n / 2);
        printf("\n");
    }
    // 아랫부분
    p = 1;
    if (n % 2 == 0) {
        x--;
        p = 2;
    }
    int q = x / 2;
    // 반복할 때마다 한 줄씩 출력
    for (i = 1; i <= x; i++) {
        for (int j = 1; j <= p; j++)
            printf(" ");
        printx(q);
        if (i % 2 == 0)
            q--;
        printf("\n");
        p++;
    }
    printf("\n");
    return 1;
}
int main() {
    int n = 5;
    printpattern(n);
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

      X
       X
      O X
     O X
  X O X O X
   X O
    X O
     X
      X

정리

이 패턴 문제의 핵심은 n의 홀짝 여부n을 4로 나눈 나머지에 따라 출력 로직을 분기 처리하는 것입니다. 공백 개수(p)와 문자 개수(s 또는 q)를 단계별로 조절하면 복잡한 대칭 구조도 반복문만으로 깔끔하게 구현할 수 있습니다. 특히 printx()printo() 함수를 분리해 두면 시작 문자만 바꿔 재사용할 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.