호우동의 개발일지

Today :


문제 이해 단계


해당 문제는 예제 케이스로 주어진 것을 보면 금방 이해된다.


한마디로, *에는 어떤 문자가 몇 개 들어가던지 상관없다.
* 앞에 있는 문자열로 시작하고, * 뒤에 있는 문자열로 끝나는 것인지를 판별하는 문제이다.

 

 


문제 접근 단계

문제를 푸는 로직을 짜는 법은 간단했다.
패턴 문자를 입력받아 이를 *를 기준으로 잘랐다.


그리고 frontStr, backStr로 분리해서 비교해야 할 문자열이 frontStr로 시작하는지 판단한다.
그리고 backStr과 같은 문자로 끝나는지 비교하여 문제 조건을 만족하는지를 판단했다.


예를 들어 패턴이 a*d였다면
frontStr 문자열에 a
backStr 문자열에 d
를 받아 이를 문자와 비교했을 것이다.

로직은 굉장히 간단했던 것 같다.
아마 식별자를 기준으로 문자를 자르는 법을 알고 있다면 쉽게 풀었을 문제이다.

 

 


문제 구현 단계

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
	//시간 줄이기
	cin.tie(NULL);
	cout.tie(NULL);
	ios::sync_with_stdio(false);
	
	
	int n;
	cin >> n;
	string str; // 입력받은 문자열 str
	cin >> str;
	istringstream ss(str);
	string token; //분리된 문자열


	getline(ss, token, '*');
	string frontStr = token;

	getline(ss, token, '*');
	string backStr = token;

	while (n-- > 0) {
		cin >> str;
		//만약 비교할 문자가 패턴문자수보다 작으면 비교할 필요도 없다.
		if (str.size() < frontStr.size() + backStr.size()) {
			cout << "NE" << "\n";
			continue;
		}
		if (frontStr == str.substr(0, frontStr.size()) &&
			//frontStr의 크기만큼 비교해줘야함
			backStr == str.substr(str.size() - backStr.size(), backStr.size()))
			//비교할 문자열에서 backStr만큼 인덱스를 앞으로 이동해서 비교
			cout << "DA" << "\n";
		else cout << "NE" << "\n";
	}
	return 0;
}

*을 기준으로 문자열을 분리하기 위해서 sstream을 라이브러리를 사용하여 분리해 줬다.


sstream으로 분리해 준 첫 번째 토큰을 frontStr, 두 번째 토큰을 backStr로 담아 분리해 줬다.

이후엔 입력한 n만큼 판별 작업을 해준다. 비교할 문자열의 글자수가
frontStr과 backStr의 문자 수보다 작다면, 아예 비교할 필요도 없이 "NE"이다.


예를 들어, frontStr이 ad, backStr이 fe인데 비교할 문자열이 abc라면 필요 없다는 뜻이다.

이 경우가 아닐 경우 비교를 시작하는데 비교는 간단하다.

frontStr로 시작하는지 체크하기 위해, 비교할 문자열의 첫 번째 인덱스부터
frontStr의 문자수만큼 잘라서 이를 frontStr과 비교한다.

backStr로 끝나는지를 체크하는 것도 같은 원리로,
시작지점을 (문자열 끝 - backStr의 글자수)로 해주고 backStr의 글자수만큼 범위를 잘라내어 비교한다.

이 두 가지 경우를 모두 성립할 때만 "DA"를 출력한다. 

 

 


시행착오

//만약 비교할 문자가 패턴문자수보다 작으면 비교할 필요도 없다.
		if (str.size() < frontStr.size() + backStr.size()) {
			cout << "NE" << "\n";
			continue;
		}

처음에는 비교할 문자열의 글자 수 제한을 고려하지 않고,
비교만 했는데
계속 "틀렸습니다"가 떠서 계속해서 고민했다.


그래서 예외케이스를 여럿 생각하면서 고민했는데,
위처럼 패턴보다 글자수가 적으면
런타임 오류(out of range)가 뜨거나 틀렸습니다가 나오는 것을 확인했다.


그래서 위와 같이 조건을 추가해 줬다.
문제는 쉽게 풀었으나 위 과정이 오래 걸렸던 것 같다.

그리고 C++에서 특정 문자를 기준으로 문자열을 자르는 것을 처음 해봤기 때문에
sstream을 사용하는 것이
 익숙하지 않아 익숙해지는데 좀 걸렸던 것 같다.