개요
이 튜토리얼에서는 C++을 사용하여 역다이아몬드 패턴을 출력하는 프로그램을 살펴보겠습니다.
사용자로부터 N 값이 주어지면, 프로그램은 높이가 2N-1인 역다이아몬드 모양의 별(*) 패턴을 화면에 출력하는 것이 목표입니다.
패턴의 구조 이해하기
역다이아몬드 패턴은 크게 두 부분으로 나눌 수 있습니다.
- 윗부분(상단 절반): 각 줄마다 양쪽 끝의 별 개수가 하나씩 감소하고, 가운데 공백이 두 칸씩 늘어납니다.
- 아랫부분(하단 절반): 윗부분과 반대로 양쪽 끝의 별이 하나씩 증가하고, 가운데 공백이 줄어듭니다.
즉, 왼쪽 삼각형 + 가운데 공백 영역 + 오른쪽 삼각형의 조합으로 각 줄이 구성됩니다.
C++ 구현 코드
#include<bits/stdc++.h>
using namespace std;
//역다이아몬드 패턴을 출력하는 함수
void printDiamond(int n){
cout<<endl;
int i, j = 0;
//윗부분(상단 절반)을 위한 반복문
for (i = 0; i < n; i++) {
//왼쪽 삼각형
for (j = i; j < n; j++)
cout<<"*";
//가운데 공백
for (j = 0; j < 2 * i + 1; j++)
cout<<" ";
//오른쪽 삼각형
for (j = i; j < n; j++)
cout<<"*";
cout<<endl;
}
//아랫부분(하단 절반)을 위한 반복문
for (i = 0; i < n - 1; i++) {
//왼쪽 삼각형
for (j = 0; j < i + 2; j++)
cout<<"*";
//가운데 공백
for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
cout<<" ";
//오른쪽 삼각형
for (j = 0; j < i + 2; j++)
cout<<"*";
cout<<endl;
}
cout<<endl;
}
int main(){
int n = 5;
printDiamond(n);
return 0;
}실행 결과
N = 5일 때 프로그램을 실행하면 아래와 같은 역다이아몬드 패턴이 출력됩니다.
***** ***** **** **** *** *** ** ** * * ** ** *** *** **** **** ***** *****
코드 동작 원리
1. 윗부분 처리
첫 번째 반복문은 총 N줄을 담당합니다. 각 줄에서 왼쪽 삼각형은 n - i개의 별을 출력하고, 가운데는 2 * i + 1개의 공백을 출력한 뒤, 오른쪽 삼각형이 왼쪽과 대칭되도록 같은 개수의 별을 출력합니다.
2. 아랫부분 처리
두 번째 반복문은 N-1줄을 담당합니다. 줄이 내려갈수록 별의 개수가 i + 2개씩 증가하고, 가운데 공백은 2 * (n - 1 - i) - 1개씩 감소하여 다이아몬드가 서서히 닫히는 형태를 만듭니다.
3. 시간 복잡도
전체 패턴의 높이가 2N-1이고 각 줄의 길이도 O(N)이므로, 이 알고리즘의 시간 복잡도는 O(N²)입니다.
마무리
역다이아몬드 패턴 문제는 중첩 반복문과 별 찍기 로직을 연습하기에 좋은 예제입니다. 코드를 직접 수정하면서 N 값을 바꿔 보거나, 공백 대신 다른 문자를 사용해 다양한 변형 패턴을 만들어 보세요.