티스토리 뷰
Algorithm/백준 - C++
[백준 C++] 15904번 UCPC는 무엇의 약자일까?, 런타임 에러 (Segfault)
heemang.dev 2024. 4. 15. 16:42https://www.acmicpc.net/problem/15904
틀린 코드 - 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;
}