본문 바로가기
자료구조

문자열 압축 문제

by kwon5346 2024. 3. 26.
반응형

문자열 압축 문제

#include <iostream>
#include <cassert>
#include <algorithm>

using namespace std;

void InsertionSort(char* arr, int n)
{
    int i, key, j;
    for (i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;

        while (j >= 0 && arr[j] > key) // <- while 사용
        {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

int Count(char* arr, int n, char x)
{
    int count = 0;
    for (int i = 0; i < n; i++) // start index 사용
    {
        if (arr[i] == x)
            count++;
    }

    return count;
}

int main()
{
    char arr[] = "ababcdfdceeedag";
    int n = sizeof(arr) - 1; // 마지막 안보이는 '\0' 제외

    assert(n >= 1);

    cout << arr << endl;

    int table[26] = { 0 }; 

    for (int i = 0; i < 26; i++)
    {
        table[i] = Count(arr, n, char(i + 97));
    }

    cout << endl;

    for (int i = 0; i < 26; i++)
    {
        if (table[i] != 0)
            cout << char(i + 97) << table[i];
    }
    cout << endl << endl;

    // 정렬 후 찾기
    InsertionSort(arr, n);

    cout << arr << endl;

    char c = arr[0];
    int count = 1;

    cout << c;

    for (int i = 1; i < n; i++)
    {
        if (arr[i] == c)
        {
            count++;
        }
        else
        {
            cout << count;
            count = 1;

            c = arr[i];
            cout << c;
        }
    }

    cout << count << endl; 

    return 0;
}

문자에 반복되는 알파벳이 몇개가 나왔는지 확인하는 코드를 2가지 방법으로 구현하였다.

output

ababcdfdceeedag

a3b2c2d3e3f1g1

aaabbccdddeeefg
a3b2c2d3e3f1g1

첫번째. 정렬이 되지 않은 배열에서 구하는 경우

    for (int i = 0; i < 26; i++)
    {
        table[i] = Count(arr, n, char(i + 97));
    }

    cout << endl;

    for (int i = 0; i < 26; i++)
    {
        if (table[i] != 0)
            cout << char(i + 97) << table[i];
    }

알파벳 a가 아스키 코드 97부터 시작인 점을 생각해 index에 97을 더해주고 char자료형으로 캐스팅하여
Count 함수에 a부터 z까지의 알파벳을 넣어줄 수 있다.

두번째. 정렬이 된 배열에서 구하는 경우

     InsertionSort(arr, n);

    cout << arr << endl;

    char c = arr[0];
    int count = 1;

    cout << c;

    for (int i = 1; i < n; i++)
    {
        if (arr[i] == c)
        {
            count++;
        }
        else
        {
            cout << count;
            count = 1;

            c = arr[i];
            cout << c;
        }
    }

    cout << count << endl; 

a부터 z까지 정렬이 되어 있기 때문에 배열의 첫번째 원소를 char형 변수 c에 넣어주고 1번 인덱스부터 순회했을때 c와 같으면 count++, c와 다르면 arr[i]를 c에 대입하는 것을 반복하면 된다. 알아두면 쓸일이 많은 방법이다.

반응형

'자료구조' 카테고리의 다른 글

이진 탐색(Binary Search)  (1) 2024.03.26
순차 탐색(Sequential Search)  (0) 2024.03.12
삽입 정렬(Insertion Sort)  (0) 2024.03.12
버블 정렬(Bubble Sort)  (0) 2024.03.07
선택 정렬(Selection Sort)  (0) 2024.03.06