본문 바로가기

알고리즘/백준 문제풀기

BOJ 백준 크로아티아 알파벳 <문자열 처리>

https://www.acmicpc.net/problem/2941


< 크로아티아 알파벳 >



크로아티아 알파벳변경
čc=
ćc-
dz=
ñd-
ljlj
njnj
šs=
žz=

 특정 문자열을 입력 받고 그 문자열에 크로아티아 알파벳이 몇 개 있는 지를 계산한 뒤에


크로아티아 알파벳을 제외한 나머지 알파벳을 각각 한 개로 계산하여 총 몇개의 알파벳으로 이루어져있는지 출력해주는 문제이다.


첫 번째 예시 ljes=njak를 보면,


lj, s=, nj 이렇게 세 가지의 크로아티아 알파벳이 있고 이 셋을 제외한 e, a, k 까지 합하여 총 6가지의 크로아티아 알파벳으로


이루어져 있는 것을 알 수 있다.


아직 string에 대한 이해도가 낮아 stirng 관련 함수를 최대한 사용하여 풀어보려 하였다.


단순히 find만 이용하여 문자열이 존재하는 지를 찾는 방법으로는 문제를 해결할 수 없다.


왜냐하면 dz= 를 찾고 나서는 dz=에 사용된 z=를 고려하지 말아야 하기 때문이다.


따라서 입력된 문자열을 한 알파벳씩 for문을 돌아주면서 크로아티아 알파벳이 있는지를 찾아보고, 없다면 인덱스를 1 증가시켜주고,


크로아티아 알파벳이 있다면 해당 크로아티아 알파벳의 사이즈만큼 증가시켜 주었다.


1. for i = 0 ~ 입력받은 문자열 사이즈


2. 크로아티아 알파벳 총 8개를 돌면서 입력받은 문자열의 i번 재 알파벳으로 시작하는 크로아티아 알파벳이 있는 지 확인

#include <iostream>
#include <string>

using namespace std;

bool strcheck[101];

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	string s[8] = { {"c="},{"c-"},{"dz="},{"d-"},
	{"lj"},{"nj"},{"s="},{"z="} };

	string temp;
	cin >> temp;
	int cnt = 0;
	int deleteSize = 0;

	for (int i = 0; i < temp.size(); ++i)
	{
		for (int j = 0; j < 8; ++j)
		{
			int size = s[j].size();
			string substr = temp.substr(i, size);
			if (substr == s[j]) {
				cnt++;
				deleteSize += size;
				i += size - 1;
				break;
			}
		}
	}
	cout << (cnt + temp.size() - deleteSize) << '\n';

	return 0;
}