작성
·
278
0
안녕하세요!
1-G 문제를 풀었는데 틀렸습니다 가 나오는 이유를 모르겠어서 질문 드립니다.
주어진 예제 입출력은 맞게 나오고, 해설 강의에서 언급하신 예외 처리도 s.erase(0, j + 1); 로 처리했다고 생각하는데 계속 틀렸습니다 가 나옵니다.
혹시 제가 잘못 짠 코드가 무엇일지 봐주실 수 있을까요?
감사합니다 :)
답변 1
0
안녕하세요 ㅎㅎ
tmp = "";
for (int j = s.length() - 1; j >= 0; --j) {
tmp += s[j];
이렇게 하게 되면 tmp에 반대로 쌓이지 않나요?
예를 들어
ab*abc라고 하고
ababc라는 문자열이 있다고 쳤을 때
ab는 삭제되고.
abc만 남은 상태에서.
temp는
c
cb
cba 이렇게 쌓이고.
cba과 abc를 비교하게 되지 않나요?
디버깅 코드를 첨부합니다.
#include <iostream>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int n;
string p, s;
vector<string> v;
vector<string> split(string input, string del) {
long long pos;
vector<string> ret;
string token = "";
while ((pos = input.find(del)) != string::npos) {
token = input.substr(0, pos);
ret.push_back(token);
input.erase(0, pos + del.length());
}
ret.push_back(input);
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin >> n >> p;
v = split(p, string(1, '*'));
for (int i = 0; i < n; ++i) {
bool flag1 = false, flag2 = false;
string tmp = "";
cin >> s;
// 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력
for (int j = 0; j < s.length(); ++j) {
tmp += s[j];
if (tmp == v.front()) {
flag1 = true;
s.erase(0, j + 1);
break;
}
}
tmp = "";
for (int j = s.length() - 1; j >= 0; --j) {
tmp += s[j];
cout << tmp << " : " << v.back() << '\n';
if (tmp == v.back()) {
flag2 = true;
break;
}
}
if (flag1 && flag2) cout << "DA" << '\n';
else cout << "NE" << '\n';
}
return 0;
}
입력:
1 ab*abc ababc
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
앗 제가 착각했네요 맞습니다ㅎㅎ
항상 친절한 답변 정말 감사합니다!