티스토리 뷰

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net


통과 코드

#include <iostream>
#include <string>

using namespace std;

int main() {
    string words[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

    string lines;
    getline(cin, lines);

    int count = 0;
    while (!lines.empty()) {
        bool flag = false;
        for (int i = 0; i < sizeof(words) / sizeof(string); i++) {
            if (lines.substr(0, words[i].length()).find(words[i]) != string::npos) {
                lines = lines.substr(words[i].length());
                count++;
                flag = true;
                break;
            }
        }
        if (!flag) {
            lines = lines.substr(1);
            count++;
        }
    }

    cout << count;
}

 

실패 코드

lines.find(words[i]) != string::npos 를 사용하면 예제 입출력은 통과하지만, 다른 반례를 통과하지 못합니다. string이 제공하는 find("찾는 문자열")는 찾고자 하는 문자열이 위치하는 index를 반환합니다. 즉, 문자열 "abc23" 에서 find("abc")를 하게 되면 0을 반환하게 됩니다.

 

현재 문제에서는 주의해야할 점이 있습니다. 크로아티아 알파벳이 문자열 가장 앞에 위치하는지를 확인해야 하는데, find()는 앞뿐만 아니라 뒤에 위치하는 문자열도 확인하게 됩니다.

 ex. "abc=".find("c=") -> return 2

 

따라서 lines.substr(0, words[i].length()).find(words[i]) 로 변경해야 합니다.

#include <iostream>
#include <string>

using namespace std;

int main() {
    string words[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

    string lines;
    getline(cin, lines);

    int count = 0;
    while (!lines.empty()) {
        bool flag = false;
        for (int i = 0; i < sizeof(words) / sizeof(string); i++) {
            if (lines.find(words[i]) != string::npos) {
                lines = lines.substr(words[i].length());
                count++;
                flag = true;
                break;
            }
        }
        if (!flag) {
            lines = lines.substr(1);
            count++;
        }
    }

    cout << count;
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30