티스토리 뷰

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

 

15904번: UCPC는 무엇의 약자일까?

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는

www.acmicpc.net


틀린 코드 - Segfault 에러

c가 C, P일 때, que.back()을 호출하는데 이때 큐가 비어있으면 오류가 발생한다.

#include <bits/stdc++.h>

using namespace std;

vector<string> split(string input) {
    stringstream ss(input);
    string buffer;
    vector<string> result;
    while(getline(ss, buffer, ' ')) {
        if(buffer[0] >= 'A' && buffer[0] <= 'Z')
            result.push_back(buffer);
    }
    return result;
}

int main() {
    string input;
    getline(cin, input);

    vector<string> words = split(input);
    queue<string> que;

    for(int i = 0; i < words.size(); i++) {
        char c = words[i].at(0);
        if(c == 'U') {
            if(que.empty())
                que.push("U");
        } else if(c == 'C') {
            if(que.back() == "U" || que.back() == "P")  {
                que.push("C");
            }
        } else if(c == 'P') {
            if(que.back() == "C")
                que.push("P");
        }
    }

    if(que.size() == 4)
        cout << "I love UCPC";
    else
        cout << "I hate UCPC";
}

틀린 코드 - 1%에서 오답

input: UC P C 일 때 I love UCPC가 출력되어야 한다. 그러나 내 코드는 I hate UCPC가 출력된다.

그 이유는 split()에서 단어의 앞글자만 확인하기 때문이다. buffer에 uuuuuUniversity가 들어오면 if문의 조건에 통과하지 못하게 된다. 

#include <bits/stdc++.h>

using namespace std;

vector<char> split(string input) {
    stringstream ss(input);
    string buffer;
    vector<char> result;
    while(getline(ss, buffer, ' ')) {
        if(buffer[0] >= 'A' && buffer[0] <= 'Z')
            result.push_back(buffer[0]);
    }
    return result;
}

int main() {
    string input;
    getline(cin, input);

    vector<char> words = split(input);
    queue<string> que;

    for(int i = 0; i < words.size(); i++) {
        char c = words[i];
        if(c == 'U') {
            if(que.empty())
                que.push("U");
        } else if(c == 'C') {
            if(que.empty())
                continue;
            if(que.back() == "U" || que.back() == "P")  {
                que.push("C");
            }
        } else if(c == 'P') {
            if(que.empty())
                continue;
            if(que.back() == "C")
                que.push("P");
        }
    }

    if(que.size() == 4)
        cout << "I love UCPC";
    else
        cout << "I hate UCPC";

    return 0;
}

 

정답 코드

마지막에 que.size() == 4로 하면 오답 처리된다. 왜냐하면 if(c == 'C')일 때 하위 조건문이 true이면 계속 que에 값을 저장하기 때문이다.

#include <bits/stdc++.h>

using namespace std;

vector<char> split(string input) {
    stringstream ss(input);
    string buffer;
    vector<char> result;
    while(getline(ss, buffer, ' ')) {
        for(int i = 0; i < buffer.length(); i++) {
            if(buffer.at(i) >= 'A' && buffer.at(i) <= 'Z')
                result.push_back(buffer.at(i));
        }
    }
    return result;
}

int main() {
    string input;
    getline(cin, input);

    vector<char> words = split(input);
    queue<string> que;

    for(int i = 0; i < words.size(); i++) {
        char c = words[i];
        if(c == 'U') {
            if(que.empty())
                que.push("U");
        } else if(c == 'C') {
            if(que.empty())
                continue;
            if(que.back() == "U" || que.back() == "P")  {
                que.push("C");
            }
        } else if(c == 'P') {
            if(que.empty())
                continue;
            if(que.back() == "C")
                que.push("P");
        }
    }

    if(que.size() >= 4)
        cout << "I love UCPC";
    else
        cout << "I hate UCPC";

    return 0;
}

 

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