반례를 생각하자

주성천·2023년 10월 9일

문제상황


백준 9996번 문제를 풀던 중 예제 입력은 통과하지만 제출 시에 통과가 되지 않는 상황을 맞딱드렸다.

백준 9996번

문제의 코드

#include<iostream>
#include<string>

using namespace std;

int main() {
	int case_cnt = 0;
	cin >> case_cnt;
	
	string pattern = "";
	cin >> pattern;
	
	string res = "";
	
	for(int i = 0; i < case_cnt; i++) {
		string input = "";
		cin >> input;
		
		bool is_end = false;
		int pattern_idx = 0;
		int input_idx = 0;
		
		while(pattern.at(pattern_idx) != '*') {
			if(pattern.at(pattern_idx) != input.at(input_idx)) {
				is_end = true;
				break;
			}
			pattern_idx++;
			input_idx++;
		}
		
		if(is_end) {
			res += "NE\n";
			continue;
		}
		
		pattern_idx = pattern.size() - 1;
		input_idx = input.size() - 1;
		
		while(pattern.at(pattern_idx) != '*') {
			if(pattern.at(pattern_idx) != input.at(input_idx)) {
				is_end = true;
				break;
			}
			pattern_idx--;
			input_idx--;
		}
		
		if(is_end) {
			res += "NE\n";
		} else {
			res += "DA\n";
		}
		
	}
	
	cout << res;
	
	return 0;
}

패턴의 앞부터 입력 값의 문자와 일치하는 지 검사 후 뒤에도 검사를 하는 단순한 로직이다.

문제 원인 및 해결


문제의 원인은 패턴과 입력의 길이를 검사하지 않는데에 있었다. 패턴의 앞과 뒤가 동일할 때 입력으로 패턴 값이 주어질 경우, 잘못된 판단을 하는 것이다.
ex)
입력 값: "ab"
패턴 값: "ab*ab"

수정된 코드

#include<iostream>
#include<string>

using namespace std;

int main() {
	int case_cnt = 0;
	cin >> case_cnt;
	
	string pattern = "";
	cin >> pattern;
	
	string res = "";
	
	for(int i = 0; i < case_cnt; i++) {
		string input = "";
		cin >> input;
		
		bool is_end = false;
		
		// 입력이 패턴 검사를 위한 길이보다 작을 경우
		if(pattern.size() - 1 > input.size()) {
			res += "NE\n";
			continue;
		}
		
		int pattern_idx = 0;
		int input_idx = 0;
		
		while(pattern.at(pattern_idx) != '*') {
			if(pattern.at(pattern_idx) != input.at(input_idx)) {
				is_end = true;
				break;
			}
			pattern_idx++;
			input_idx++;
		}
		
		if(is_end) {
			res += "NE\n";
			continue;
		}
		
		pattern_idx = pattern.size() - 1;
		input_idx = input.size() - 1;
		
		while(pattern.at(pattern_idx) != '*') {
			if(pattern.at(pattern_idx) != input.at(input_idx)) {
				is_end = true;
				break;
			}
			pattern_idx--;
			input_idx--;
		}
		
		if(is_end) {
			res += "NE\n";
		} else {
			res += "DA\n";
		}
		
	}
	
	cout << res;
	
	return 0;
}

패턴에서 '*'를 제외한 길이보다 입력의 길이가 더 작을 경우에 대한 검사 조건을 넣어주니 정상적으로 통과하게 되었다.

profile
기록과 정리

0개의 댓글