[문제풀이] - 문자 히스토그램 ⭕

LSDrug·2024년 8월 22일
0

문제풀이

목록 보기
19/21
post-thumbnail

문제

네 줄(한 줄 당 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;
}

profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글

관련 채용 정보