이 튜토리얼에서는 C++를 사용하여 콘솔 화면에 오두막(Hut) 모양의 패턴을 출력하는 프로그램을 살펴봅니다.
프로그램은 오두막의 너비(N)를 입력으로 받습니다. 목표는 별표(*) 문자를 활용해 주어진 너비에 맞는 오두막 외곽 구조를 그리고, 세로줄(|)과 밑줄(_) 문자를 조합하여 오두막 내부에 문(게이트)을 표현하는 것입니다.
구현 접근 방식
이러한 패턴 출력 문제는 행(row)과 열(column)을 이중 반복문으로 순회하면서, 각 좌표가 어느 영역에 속하는지 조건식으로 판단한 뒤 해당 문자를 출력하는 방식으로 해결합니다. 핵심 로직은 다음과 같습니다.
- 너비 보정: 입력된 N이 짝수일 경우 대칭 구조를 유지하기 위해 1을 더해 홀수로 변환합니다.
- 외곽 경계 판별: 지붕의 양쪽 사선(i + j == n/5 또는 j - i == n/5), 벽의 좌우 기둥(j == 0, j == n-1), 바닥(i == n - n/3) 등의 조건을 만족하는 좌표에는 별표를 출력합니다.
- 문(게이트) 그리기: 문의 상단은 밑줄(_), 양옆은 세로줄(|)로 표현하며, 나머지 좌표는 공백으로 채웁니다.
예제 코드
#include <iostream>
using namespace std;
// 주어진 오두막 구조를 출력하는 함수
int print_hut(int n){
int i, j, t;
if (n % 2 == 0) {
n++;
}
for (i = 0; i <= n - n / 3; i++) {
for (j = 0; j < n; j++) {
t = 2 * n / 5;
if (t % 2 != 0) {
t--;
}
// 시작 문자로부터의 거리를 계산하여
// 오두막의 외곽 경계를 출력
if (i == n / 5
|| i == n - n / 3
|| (j == n - 1 && i >= n / 5)
|| (j >= n / 5 && j < n - n / 5 && i == 0)
|| (j == 0 && i >= n / 5)
|| (j == t && i > n / 5)
|| (i <= n / 5 && (i + j == n / 5 || j - i == n / 5))
|| (j - i == n - n / 5)) {
cout << "*";
}
// 문(게이트)의 구조를 출력
else if (i == n / 5 + n / 7 && (j >= n / 7 && j <= t - n / 7)) {
cout << "_";
}
else if (i >= n / 5 + n / 7 && (j == n / 7 || j == t - n / 7)) {
cout << "|";
}
else {
cout << " ";
}
}
cout << "\n";
}
}
int main(){
int n = 12;
print_hut(n);
return 0;
}
출력 결과
********** * * * ************* *___* * *| |* * *| |* * *| |* * *| |* * *| |* * *************
위 코드를 실행하면 입력 너비에 맞춰 지붕, 벽, 문이 모두 포함된 완전한 오두막 형태가 콘솔에 출력됩니다. 조건식에 사용된 비율 값(n/5, n/7 등)을 조정하면 지붕의 높이나 문의 크기와 위치를 자유롭게 변경할 수 있으니, 여러 가지 값으로 실험해 보면서 패턴이 달라지는 과정을 직접 확인해 보시기 바랍니다.