본문 바로가기

C++

코딩테스트 문자열,배열 문제 정리

#include <iostream>
#include <string>
#include <map>
using namespace std;

char FirstNoneRepeat(string str); //반복되지 않는 첫번쨰 문자 찾기(map)
string FlipString(string str); //문자열 뒤집기(전체)
string FlipString(int start, int end, string& str); //원하는 자리만큼 flip
string RemoveChar(string str, string rev); // 문자열에서 특정 문자 없애기
string FlipWordBuf(string str); //단어뒤집기 임시버퍼 사용
string FlipWordNoBuf(string str); //단어뒤집기 기존 문자열사용 

string IntToString(int num); //정수형을 문자열로 음수체크
int StringToInt(string str); //문자열을 정수로 음수체크

int main(void)
{
	string str = "Pacific War: Battle of Midway.";
	string rev = "aeiou";
	string flipStr = "Remember me, for centuries.";
	string sNum = "-12345";
	string repeatStr = "tomato";
	int num = -123;

	cout <<"반복되지않는 문자: "<<FirstNoneRepeat(repeatStr) << endl;
	cout << RemoveChar(str, rev) << endl;

	cout << StringToInt(sNum) << endl;
	cout<< IntToString(num) << endl;

	cout << FlipString(flipStr) << endl;
	cout<< FlipWordBuf(flipStr) << endl;
	cout << FlipWordNoBuf(flipStr) << endl;


	return 0;
}

char FirstNoneRepeat(string str)
{
	map<char, int> *hash = new map<char, int>();
	int length = str.length();

	for (int i = 0; i < length; i++)
	{
		auto it = hash->find(str[i]);
		if (it != hash->end())
		{
			++(it->second);
		}
		else
		{
			hash->emplace(str[i], 1);
		}
	}
	for (auto arr : *hash)
	{
		if (arr.second == 1)
		{
			return arr.first;
		}
	}
	return 0;
}

string FlipString(string str)
{
	int length = str.length();

	for (int i = 0; i < length / 2; i++)
	{
		auto tmp = str[i];
		str[i] = str[length - 1 - i];
		str[length - 1 - i] = tmp;
	}
	return str;
}

string RemoveChar(string str, string rev)
{
	int src = 0, dst = 0;
	bool flag[128] = { false, }; //아스키코드 기준

	for (src = 0; src < rev.length(); ++src)
	{
		flag[rev[src]] = true;
	}

	//flag 해당 문자열 true
	for (src = 0; src < str.length(); ++src)
	{
		if (!flag[str[src]])
		{
			str[dst] = str[src];
			dst++;
		}
	}
	string result(str, 0, dst);
	return result;
}

string FlipWordBuf(string str)
{
	int len = str.length();
	int tokenPos = len - 1;
	int writePos = 0;
	int readPos, endPos = 0;
	char* buf = new char[len];

	while (tokenPos >= 0)
	{
		if (str[tokenPos] == ' ')
		{
			//문자복사
			buf[writePos] = str[tokenPos];
			writePos++;
			tokenPos--;
		}
		else
		{
			endPos = tokenPos;
			while (tokenPos >= 0 && str[tokenPos] != ' ')
				tokenPos--;
			readPos = tokenPos + 1;

			while (readPos <= endPos)
				buf[writePos++] = str[readPos++];
		}
	}

	buf[writePos] = '\0';
	return buf;
}

string FlipWordNoBuf(string str)
{

	int len = str.length();
	int startPos = 0;

	FlipString(0, len - 1, str);
	for (int i = 0; i < len; i++)
	{
		if (str[i] == ' ')
		{
			FlipString(startPos, i - 1, str);
			startPos = i + 1;
		}
	}

	if (startPos != len - 1)
		FlipString(startPos, len - 1, str);

	return str;
}

string FlipString(int start, int end, string& str)
{
	auto len = start + end;
	auto dif = end - start;

	for (int i = start; i <= len / 2; i++)
	{
		auto tmp = str[i];
		str[i] = str[len - i];
		str[len - i] = tmp;
	}
	//cout << str << endl;
	return str;
}

int StringToInt(string str)
{
	int len = str.length();
	int result = 0, temp = 0, start = 0;
	bool minus = false;

	if (str[0] == '-')
	{
		minus = true;
		start++;
	}

	for (int i = start; i < len; i++)
	{
		temp = str[i] - 48;

		result *= 10;
		result += temp;
	}

	if (minus)
		result *= -1;

	return result;
}

string IntToString(int num)
{
	int tmp = num;
	char* buf = new char[3];
	int i = 0;
	bool minus = false;

	if (num < 0)
	{
		minus = true;
		tmp *= -1;
	}


	while (tmp != 0)
	{
		buf[i++] = (char)(tmp % 10 + '0');

		tmp /= 10;
	}
	// 123 -> 12..3 -> 1...2 -> 0...1
	string result = "";
	int cnt = 0;

	if (minus)
		result.append("-");

	while (i > 0)
	{
		i--;
		result.push_back(buf[i]);
	}

	return result;
}

 

문자열 뒤집기, 단어 뒤집기 (임시버퍼, 기존 문자열사용), 특정문자 제거, 반복되지 않는 첫 단어

'C++' 카테고리의 다른 글

C++ 피보나치 수열 여러 구현 방법 (Fibonacci C++ )  (0) 2020.01.01