본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2941번: 크로아티아 알파벳 -C++

728x90

[백준알고리즘] 2941번: 크로아티아 알파벳 -C++

2941번: 크로아티아 알파벳 (acmicpc.net)

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

크로아티아 알파벳과 변경된 문자를 맵핑하는 개념이 필요했다.

 

set 만들고, 변경 후의 문자들을 넣어주었다.

이때 "dz="의 경우만 길이가 3이고 나머지는 2이기 때문에 "dz="를 제외한 것들을 넣어주었다.

 

이후 하나씩 인덱싱하면서 앞 글자와 현재 글자를 한 쌍으로 만들어 길이가 2인 substr을 만들었다.

substr이 변경된 문자 set에 포함되는 경우 원래 길이는 하나 더 늘어나지 않기 때문에 (2글자가 1글자로 맵핑되는 것이기 때문에) continue를 해준다.

 

다만, 이때 "z="였다면, "dz="일 수도 있기 때문에 확인을 해준다. "z="였다면 카운팅을 하나 안 해주면 되지만, "dz="였다면 카운팅을 하나 빼줘야 3글자를 1글자로 맞추는 것이기 때문이다.

 

#include <iostream>
#include <string>
#include <set>

int main(void)
{
	std::string croatia;
	std::cin >> croatia;
	
	std::set<std::string> word_map;
	word_map.insert("c=");
	word_map.insert("c-");
	word_map.insert("d-");
	word_map.insert("lj");
	word_map.insert("nj");
	word_map.insert("s=");
	word_map.insert("z=");

	int total = 1;
	for (size_t i = 1; i < croatia.length(); i++)
	{
		std::string temp = croatia.substr(i - 1, 2);
		if (word_map.find(temp) != word_map.end())
		{
			if (temp == "z=" && i > 1)
			{
				temp = croatia.substr(i - 2, 3);
				if (temp == "dz=") total--;
			}

			continue;
		}

		total++;
	}
	std::cout << total;
}

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90