C++ 개념 공부/알고리즘

[C++] 문자열 압축

taene_ 2024. 4. 5. 22:07

- 문자열 문제에 삽입정렬과 선택정렬을 접목시켜보았다.

#include <iostream>
using namespace std;

int StartCount(char* arr, int size, int startIndex)
{
	int count = 0;
	int i = startIndex;
	for (; arr[startIndex] == arr[i++]; count++);

	return count;
}

int SortArrayCount(char* arr, int size, int index)
{
	return StartCount(arr, size, index);
}

void InsertionSort(char* arr, int size)
{
	for (int i = 0; i < size - 1; i++)
	{
		if (arr[i] > arr[i + 1])
		{
			char insert = arr[i + 1];
			int insertIndex = -1;
			for (int j = i; j >= 0 && insert < arr[j]; j--)
			{
				arr[j + 1] = arr[j];
				insertIndex = j;
			}
			if (insertIndex > -1)
				arr[insertIndex] = insert;
		}
	}
}

void SelectionSort(char* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		int min = 999;
		int minIndex = -1;
		for (int j = i; j < size; j++)
		{
			if (min > arr[j])
			{
				min = arr[j];
				minIndex = j;
			}
		}
		swap(arr[i], arr[minIndex]);
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	char arr[] = "zxxxzcckkkzxxxaabbyyababcdfdceeedag";
	int n = sizeof(arr) - 1;

	cout << arr << '\n';

	//카운트 배열을 만들어서 해결 
	//- count할때마다 배열전체를 탐색하기 때문에 비효율적이다
	int count[26] = {};

	for (int i = 0; i < n; i++)
	{
		count[arr[i] - 'a']++;
	}

	for (int i = 0; i < 26; i++)
	{
		if (count[i] > 0)
			cout << char(i + 'a') << count[i];
	}
	cout << '\n';

	//카운트 배열을 만들지 않고 직접 출력해서 해결 - 정렬 후 출력
	InsertionSort(arr, n);
	//SelectionSort(arr, n);

	//처음부터 index의 범위로 쓸 n을 char배열의 '\0'을 뺀 크기로 했다.
	//첫번째 풀이
	for (int i = 0; i < n; i++)
	{
		if (i == 0)
			cout << arr[i] << SortArrayCount(arr, n, i);
		if (arr[i] < arr[i + 1])
			cout << arr[i + 1] << SortArrayCount(arr, n, i + 1);
	}

	/*
	//두번째 풀이
	//처음과 마지막의 경우의 수만 따로 처리해준다
	char c = arr[0];
	int cnt = 1;
	cout << c;
	for (int i = 1; i < n; i++)
	{
		if (arr[i] == c)
		{
			cnt++;
		}
		else
		{
			cout << cnt;
			c = arr[i];
			cnt = 1;

			cout << c;
		}
	}
	cout << cnt << '\n';
	*/

	return 0;
}