• [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()에 공백도 포함되어있으므로 공백 수는 제거하자!

    profile
    데롱디롱

    희희.. (๑′ᴗ‵๑)

    댓글