https://www.acmicpc.net/problem/2941
문제
> 예전엔 운영체제에서 크로아티아 알파벳을 입력할 수 없어서 표처럼 변경해서 입력했다.
> 단어가 주어졌을 때, 몇개의 크로아티아 알파벳으로 이루어졌는지 출력해라.

접근
비교할 크로아티아 알파벳을 미리 정의 해주고 입력받은 문자열을 substr로 잘라 비교한다. 목록에 존재하면 크로아티아 알파벳의 개수를 누적하고 해당 알파벳의 글자 수 만큼 넘겨 다시 비교하고 출력한다.
문제해결
> 크로아티아 알파벳(cAlpha)를 문제에서 준대로 정의하고 비교할 문자열을 입력받는다.
> 일단 두자리 크로아티아 알파벳들과 입력받은 문자열을 두자리 substr해서 비교한다. 같은 알파벳이 존재하면 두자리 수를 넘어가기 위해 i+=1을 해준다.(for문에 i++이 있기때문에) 뒤에 세자리 짜리 알파벳과 비교하거나 크로아티아 알파벳이 아닌경우에 대해 실행여부를 위해 valid값을 갱신한다.
> valid가 true 즉, 두자리 중 같은게있다면 다음 문자열을 비교하고 false면 "dz="와 비교한다. 같다면 세글자라서 i+=2해주고 다르면 그냥 일반 알파벳이므로 i++가 있기 때문에 i에대한 추가적인 연산은 하지않는다.
> 누적된 cnt를 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
vector<string> cAlpha = { "c=", "c-", "d-", "lj", "nj", "s=", "z=", "dz=" };
string s;
cin >> s;
int cnt = 0;
for (int i = 0; i < s.length(); i++)
{
bool valid = false;
for (int j = 0; j < 7; j++)
{
if (s.substr(i, 2) == cAlpha[j])
{
cnt++;
i+=1;
valid = true;
}
}
if (valid) continue;
else
{
if (s.substr(i, 3) == cAlpha[7])
{
cnt++;
i += 2;
}
else
cnt++;
}
}
cout << cnt << '\n';
}

후기