이 튜토리얼에서는 배열에 저장된 데이터를 활용하여 콘솔에 히스토그램을 출력하는 C++ 프로그램을 살펴보겠습니다.
프로그램에는 정수 값들이 들어 있는 배열이 입력으로 주어집니다. 우리가 해야 할 작업은 x축과 y축의 각 좌표 값이 배열에 담긴 실제 값과 일치하도록 히스토그램을 그려내는 것입니다. 즉, 세로축(y)에는 배열 요소가 가질 수 있는 최댓값부터 0까지의 눈금을 표시하고, 가로축(x)에는 각 배열 요소를 순서대로 배치한 뒤, 해당 위치의 요소 값이 현재 y 눈금보다 크거나 같으면 'x' 문자를 찍는 방식입니다.
알고리즘 동작 원리
히스토그램 생성 함수의 핵심 로직은 다음과 같습니다.
1. max_element 함수를 사용해 배열 내 최댓값을 구합니다.
2. 최댓값부터 0까지 반복하며 각 높이(눈금)마다 배열 전체를 순회합니다.
3. 배열 요소가 현재 눈금 값보다 크거나 같으면 'x'를, 아니면 공백을 출력합니다.
4. 모든 행이 출력되면 구분선을 그리고, 마지막 줄에 원래 배열 값을 나열해 가로축 레이블을 완성합니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
void make_histogram(int arr[], int n){
int maxEle = *max_element(arr, arr + n);
for (int i = maxEle; i >= 0; i--) {
cout.width(2);
cout << right << i << " | ";
for (int j = 0; j < n; j++) {
if (arr[j] >= i)
cout << " x ";
else
cout << " ";
}
cout << "\n";
}
for (int i = 0; i < n + 3; i++)
cout << "---";
cout << "\n";
cout << " ";
for (int i = 0; i < n; i++) {
cout.width(2);
cout << right << arr[i] << " ";
}
}
int main() {
int arr[10] = { 10, 9, 12, 4, 5, 2,
8, 5, 3, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
make_histogram(arr, n);
return 0;
}출력 결과
12 | x 11 | x 10 | x x 9 | x x x 8 | x x x x 7 | x x x x 6 | x x x x 5 | x x x x x x 4 | x x x x x x x 3 | x x x x x x x x 2 | x x x x x x x x x 1 | x x x x x x x x x x 0 | x x x x x x x x x x --------------------------------------- 10 9 12 4 5 2 8 5 3 1
코드 설명
cout.width(2)와 right 조정자를 사용하면 숫자를 오른쪽 정렬하여 두 자리 폭으로 출력할 수 있어, 눈금과 세로 축선('|')이 깔끔하게 맞춰집니다. 시간 복잡도는 O(maxEle × n)으로, 최댓값이 크지 않은 데이터 집합에 적합합니다. 이 방식을 응용하면 별(*) 문자나 다른 기호로 히스토그램 스타일을 바꾸거나, 가로 방향 히스토그램으로 확장할 수도 있습니다.