Programming/Baekjoon

백준 9996 한국이 그리울 땐 서버에 접속하지 [c++]

fishersheep 2022. 4. 17. 17:50
반응형
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <vector>
#include <stack>
#include <iostream>
#include <algorithm>

using namespace std;


int main()
{	
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string pt;
	string temp;
	
	vector<string>v;
	int n;

	cin >> n;	//문자열개수입력
	cin >> pt;	//문자열패턴입력

	for (int i = 0; i < n; i++)
	{
		cin >> temp;	//확인할 문자열 입력

		stack<char>s;
		for (int j = pt.size() - 1; j >= 0; j--)	//패턴을 stack에 역순으로 저장, stack의 구조상 꺼낼때 패턴의 앞부터 확인하게됨
			s.push(pt[j]);

		int idx = 0;	//현재인덱스 저장할 변수

		while (1)
		{	
			if (s.empty())	//stack이 비어있다면 패턴을 모두확인한 것임으로 일치한경우
			{
				v.push_back("DA");
				break;
			}

			if (temp[idx] == s.top())	//현재위치의 문자가 패턴과 일치한경우
			{
				idx++;	//인덱스증가
				if(!s.empty())	//stack 값 삭제
					s.pop();
				
			}
			else if (s.top() == '*')	//*을 만난경우 현재까지 패턴이 모두일치한것
			{
				if(!s.empty())	//stack 값 삭제
					s.pop();

				int len = s.size();	//남은 패턴의 문자수

				if (temp.size() - (idx - 1) <= len)	//현재까지 확인한 문자들을 빼고 남은 문자의 수가 len과 같거나 작은경우
				{
					v.push_back("NE");	//일치할 수 없기에 NE 저장 후 종료
					break;
				}
				
				idx = temp.size() - len;	//위의 경우가 아니라면 문자열의 개수 - len을 통해서 문자열의 뒷부분으로 idx 값 저장 
			}
			else
			{
				v.push_back("NE");	//패턴과 일치하지 않은경우
				break;
			}
		}

	}


	for (int i = 0; i < v.size(); i++)	//결과출력
		cout << v[i] << '\n';
	
	return 0;
}
반응형

'Programming > Baekjoon' 카테고리의 다른 글

백준 14500 테트로미노 c++  (0) 2022.04.30
백준3048 개미 c++  (0) 2022.04.28
백준 3085 사탕게임 [c++] [완전탐색]  (0) 2022.04.05
백준 11931 c++ 수 정렬하기4  (0) 2022.03.16
백준 11728 배열합치기 c++  (0) 2022.03.16