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

jw·2022년 2월 6일

백준

목록 보기
7/141
post-thumbnail

문제 설명

https://www.acmicpc.net/problem/9996
알파벳 소문자 여러 개와 별표 하나로 이루어진 문자열이 패턴으로 주어진다. 별표를 기준으로 접두사와 접미사로 나눈다.
n개 줄에 걸쳐 입력으로 주어진 파일이름의 접두사와 접미사가 일치하는지 판단하는 문제다.

아이디어

1차 풀이 - 별표의 index를 알고(=check) check index전까지는 front문자열, 그 뒤로는 back 문자열이라고 저장해서 입력받은 파일 이름을 하나하나 비교하는 방식으로 풀이했다.

예외처리가 필요했다. ab * ab 같은 경우 ab가 파일 이름으로 주어지면 일치하지 않는 것으로 처리해야하지만 이 예외를 처리해주지 않으면 이게 일치하는 답이라고 나온다.

+for문으로 필요한거 찾느라 코드가 너무 길어졌다..
(코드짜면서 생각을 시작해서 코드가 주구장창 길어짐)

int n;
string p,s,front,back,tmp;
int check;

int main() {

	cin >> n;
	cin >> p;
	for (int i = 0; i < p.length(); i++) {
		if (p[i]=='*') {
			check = i;
			break;
		}	
	}
	for (int i = 0; i < p.length(); i++) {
		if (i < check)front += p[i];
		else if(i>check) back += p[i];
	}
	for (int j = 0; j < n; j++) {
		int flag = 0;
		cin >> tmp;
		if (tmp.length() < p.length()-1) flag = 1;

		for (int i = 0; i < front.length(); i++) {
			if (tmp[i] != front[i]) {
				flag = 1;
				break;
			}
		}

		int k = back.length()-1;

		if (flag == 0) {
			for (int i = tmp.length()-1; i >= tmp.length()-back.length(); i--) {
				if (tmp[i] != back[k]) {
					flag = 1;
					break;
				}
				k--;
			}
		}
		if (flag == 1) {
			cout << "NE" << "\n";
		}
		else {
			cout << "DA" << "\n";
		}
	}
}

전체 코드

2차 풀이

int n;
string p,s,front,back,tmp;
int check;

int main() {

	cin >> n;
	cin >> p;

	check = p.find('*');
	front = p.substr(0, check);
	back = p.substr(check + 1);

	for (int i = 0; i < n; i++) {
		cin >> tmp;
		if (tmp.length() < front.size() + back.size())
			cout << "NE\n";
		else {
			if (front == tmp.substr(0, front.size())
				&& back == tmp.substr(tmp.size() - back.size())) {
				cout << "DA\n";
			}
			else {
				cout << "NE\n";
			}
		}
	}
}

🤣

check = p.find('*');

문자열 p에서 별표에 해당하는 문자의 index 추출하기
(간단...)


front = p.substr(0, check);
back = p.substr(check + 1);

substr을 이용해서 문자열 자르기!

profile
다시태어나고싶어요

0개의 댓글