• [2941] 백준 : 크로아티아 알파벳(C++)

    2020. 4. 24.

    by. 데롱디롱

    728x90

     

     

    * 접근한 방법
    - 벡터에 변경된 문자열을 담는다.
    - loop을 돌면서 벡터에 담긴 문자열과 같은 것이 있는지 find()
    - 같은 문자열을 발견하면 삭제
    - 문자열이 삭제된 횟수 + 문자열에 남은 size() 출력

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int sum = 0, num = 0, blank = 0;
    	bool find = false;
    	vector<string> cro = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
    	string s;
    	getline(cin, s);
    
    	while (1)
    	{
    		find = false;
    		for (int i = 0; i < cro.size(); i++)
    		{
    			if (s.find(cro[i]) != string::npos) {
    				int place = s.find(cro[i]);
    				// n(lj)j에서 lj가 제거되면, nj를 또 삭제하기 때문에 공백을 넣어 방지
    				s[place + cro[i].size() - 1] = ' ';		
    				s.erase(place, cro[i].size() - 1);
    				find = true;
    				blank++;
    				num++;
    				break;
    			}
    		}
    		if (find == false)
    			break;
    	}
    	num = num + s.size() - blank;
    	cout << num;
    
    	return 0;
    }

     

    * 생각하지 못했던 점
    - find()결과가 없는 경우 0이 들어올 것 같았는데, 엄청큰 숫자가 들어옴.
      => 결과가 없는 경우는 s.find("문자열") == string::npos 이렇게 비교하자!
    - 크로아티아문자에 해당하는 문자를 문자열사이에서 빼게되면 그 앞, 뒤글자들이 모여서 또 크로아티아문자로 계산함.
      => 같은 문자열을 삭제할때 공백을 넣어주어 분리해주자!
      => 문자열이 삭제된 횟수 + 문자열에 남은 size()를 출력할때, size()에 공백도 포함되어있으므로 공백 수는 제거하자!

    댓글