문제
정답 코드
#include <iostream>
#include <string>
using namespace std;
char result[101];
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
string input;
cin >>input;
string head;
string tail;
for (int i=0; i < input.size(); i++)
{
if (input[i] == '*')
{
head = input.substr(0, i);
tail = input.substr(i+1, input.size());
break;
}
}
string cmp;
int i;
for (i=0; i < n; i++)
{
cin >> cmp;
if (cmp.size() < head.size() + tail.size())
{
result[i] = 2;
}
else
{
if (cmp.substr(0,head.size()) == head && cmp.substr(cmp.size() - tail.size(), tail.size()) == tail)
result[i] = 1;
else
result[i] = 2;
}
}
for (int j =0; j < i; j++)
{
if (result[j] == 1)
cout << "DA\n";
else if (result[j] == 2)
cout << "NE\n";
}
}
문제 풀이의 흐름
- 일단 앞쪽에 있는 문자열을 *이 나오기 전까지 잘라서 가지고 있고
- 뒤쪽에 있는 문자열을 *이 나온 이후 뒤에 있는 걸로 자른다.
- 혹시나 길이가 head와 tail의 길이의 합보다 큰 경우에는 절대 같은 값이 될 수 없음을 인지하고 그 부분은 실패했다는 의미로 flag를 2로 해서 아니라고 표시를 한다.
- 그 외의 경우에는 이제 substr을 사용해서 head와 tail이 같아야만 패턴이 일치하는 것으로 구분하였다.
주의 할 점
- a*d 인 입력에서 a만 들어올 때 DA가 출력되는게 아니라 NE가 출력되어야만 한다.
- a*d 말고도 abc*ABC 이런식으로 들어올 수 있음을 알아야한다.
반성 및 고찰
실패 코드
#include <iostream>
#include <string>
using namespace std;
char result[101];
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
string input;
cin >>input;
char a =input[0];
char b = input[2];
// cout << b;
string cmp;
int i;
for ( i=0; i < n;i++)
{
cin >> cmp;
// cout << *(cmp.end());
if (cmp.size() > 1 && cmp[0] == a && *(cmp.end() - 1) == b)
result[i] = 1;
// cout << "DA\n";
else
result[i] = 2;
// cout << "NE\n";
}
for (int j =0; j < i; j++)
{
if (result[j] == 1)
cout << "DA\n";
else if (result[j] == 2)
cout << "NE\n";
}
}
실패원인
- 문제를 잘 못 읽었다. 예시에 문자 1개 *1개 문자1개 이런식으로 되어있어서 파싱을 아에 그렇게 해줬는데 문자는 여러가지가 올 수가 있었다.
- a*d 말고도 abc*ABC 이런식으로 들어올 수 있음을 알아야한다.
그 외의 고찰
string에서 end()를 보면 마지막 이터레이터를 보는데 실패 코드에서 *(cmp.end())
로 비교를 할 때 간간히 성공을 했다. 아마 컴파일러가 알아서 최적화를 해준 것 같은데 이 부분은 앞으로 주의해서 사용을 해야 할 것 같고 끝 부분을 볼때는 반드시 str1.back(); 이런식으로 사용해줄 것을 권장하는 것 같다.
end()-1 로 접근해서 봐도 문제는 없는 것 같다 다만 더 간단한 back이 있으니까 back 메서드를 써주도록 하자
Uploaded by N2T
728x90
'알고리즘 > 백준-실버' 카테고리의 다른 글
백준 1940번 주몽(C++) (0) | 2023.01.02 |
---|---|
백준 1213번 팰린드롬 만들기(C++) (0) | 2022.12.30 |
백준 9375번 패션왕 신해빈(C++) (0) | 2022.12.30 |
백준 1620번 나는야 포켓몬 마스터 이다솜(C++) (0) | 2022.12.30 |
백준 2559번 수열 (C++) (0) | 2022.12.30 |