네 줄(한 줄 당 72자 이내)을 입력으로 받아 각 문자의 빈도수를 구하여 출력하는 문자 히스토그램을 출력하는 문제이다. 입력되는 알파벳은 모두 대문자이다.
입력
각 줄은 72자 이내의 문자(대문자, 특수문자)로 이루어진다.
출력
불풀요한 공백과 빈줄을 출력해서는 안된다.
나름 괜찮게 풀 수 있었던 문제. 다만 헷갈렸던 것은 어떻게 빈도수를 히스토그램으로 나타낼 것인가? 이다.
나는 이중 배열을 만들어서 행과 열을 바꾸어서 넣은 뒤, 행과 열을 고려하여 이중 배열을 출력하는 방법을 사용했다.
위 사진은 어떠한 문자열에 관한 알파벳 빈도수의 히스토그램이다. 이를 그대로 나타내는 것도 가능하지만, 이를 가능케 하려면 상당히 어려울 것 같다.
특히 알파벳의 빈도수가 고정되어 있지 않고 바뀌기 때문에, 행을 고르는 데 어렵다.
애초에, 별을 넣는 것조차 어렵다. 아래에서부터 올라오던지, 위에서부터 계산해서 올라와야 하기 때문이다.(행이 일정하지 않아서 더 어렵다.)
하지만 사진을 조금 돌려보면 조금 쉬워진다.
행이 고정되어 있기 때문에 열만 신경쓸 수 있고 덕분에 별을 찍기가 쉬워진다.
이렇게 넣고 출력할 수 있다면 쉽게 해결할 수 있을 것이다.
코드는 다음과 같다.
#include <bits/stdc++.h> /// 라이브러리 파일 통일
using namespace std;
int i,j;
int alp[26]; // 알파벳 빈도를 확인하는 배열
int p[26][101]; // 히스토그램 판. 총 72개가 최대이나, 101로 넉넉히 잡음.
int main()
{
/// freopen("input.txt", "r", stdin); /// 읽기
for(i=0; i<4; i++){
string str;
getline(cin, str); /// 공백까지 모두 읽음
for(j=0; j<str.size(); j++) { /// 빈도수를 확인
if(str[j] == ' ') {
continue;
} else if(str[j] >= 'A' && str[j] <= 'Z') {
alp[str[j] - 'A'] += 1;
} else {
continue;
}
}
}
for(i=0; i<26; i++){ /// 별을 넣기 위한 작업.
for(j=0; j<alp[i]; j++){
p[i][j] = 1;
}
}
/// 열의 최대값을 확인하기 위한 작업
int cnt = INT_MIN;
for(i=0; i<26; i++) {
if(alp[i] >= cnt) cnt = alp[i];
}
for(i=cnt-1; i>=0; i--) {
for(j=0; j<26; j++) {
if(p[j][i] == 1) cout << "* "; /// 1이 있던 부분 ==> 별을 찍을 부분
else cout << " "; // 아닌 부분은 공백(0 공백과 다른 공백을 하나 더 준다.)
}
cout << endl;
}
/// 아래에 나타나는 알파벳
char c = 'A';
for(i=0; i<26; i++){
cout << (char)(c + i) << " ";
}
return 0;
}