그냥 블로그

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

C++/백준

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

코딩하는 공대생 2023. 10. 4. 08:54
반응형

https://www.acmicpc.net/problem/9996
 
 
 
처음에는 앞에서 부터 시작해서 for 문 두개 돌린 다음 *을 만나면 멈추고,
비교 문자열은 * 다음 문자를 만날 때 까지 돌리는 방식으로 진행했다. 
근데 이렇게 되면 문제가 생기는게 
n*n
nnnna
이런 경우에 사실상 맞지 않는데 다음 문자로 넘어가 버리거나 
nanan 
이런 경우에는 맞는데 틀렸다고 나와버린다. 심지어 index 초과
 
 
그래서 아예 별을 기준으로 앞 뒤를 분리하고 비교하는 앞에서부터 뒤에서부터 비교하는 식으로 작성해야 한다. 
 
[내 풀이] 

#include<bits/stdc++.h>
#include <iostream>

using namespace std;

string f, file;
int star_idx, f_len;

int num;

int main() {
	cin >> num;
	cin >> f;
	f_len = f.length() -1;
	for (int i = 0; i < f_len; i++) if (f[i] == '*') star_idx = i;
	
	for (int i = 0; i < num; i++) {
		cin >> file;
		int file_len = file.length() - 1;
		string result = "DA";
		for (int j = 0; j < star_idx; j++) {
			if (f[j] != file[j]) {
				result = "NE";
				break;
			}
		}

		for (int j = 0; j < f_len - star_idx; j++) {
			if ((f[f_len - j] != file[file_len - j]) ||(file_len-j < star_idx)) {
				result = "NE";
				break;
			}
		}
		cout << result << endl;
	}
	return 0;
}

 
[보완]
find, substr 함수를 기억하자 
 

#include<bits/stdc++.h>

using namespace std;
int n;
string s, ori_s, pre, suf;

int main() {
	cin >> n;
	cin >> ori_s;
	int pos = ori_s.find('*');
	pre = ori_s.substr(0, pos);
	suf = ori_s.substr(pos + 1);
	for (int i = 0; i < n; i++) {
		cin >> s;
		if (pre.size() + suf.size() > s.size()) {
			cout << "NE\n";
		}
		else {
			if (pre == s.substr(0, pre.size()) && suf == s.substr(s.size() - suf.size())) cout << "DA\n";
			else cout << "NE\n";
		}
	}

	return 0;
}

https://cplusplus.com/reference/string/string/substr/

https://cplusplus.com/reference/string/string/substr/

12345678910111213141516171819 // string::substr #include #include int main () { std::string str="We think in generalities, but we live in details."; // (quoting Alfred N. Whitehead) std::string str2 = str.substr (3,5); // "think" std::size_t pos = str.find

cplusplus.com

string substr (size_t pos = 0, size_t len = npos) const;

시작 주소부터 string을 복사해서 반환한다. 
 
pos ? 복사할 문자의 시작 위치(index) 1) 복사할 문자와 길이가 같으면 빈 문자열을 반환한다 2) 복사할 문자보다 길이가 크면 out_of_range를 던진다.
 
len ? 넣지 않으면 끝까지.
 

find()

원하는 문자열의 시작 위치를 반환한다. 
1) 문자열.find(찾을 문자열);
2) 문자열.find(찾을 문자);
3) 문자열.find(찾을 문자열, 시작 위치 );
 
찾는 문자가 없으면 string::size_type의 string:: npos라는 상수를 반환한다. 
 

if (str1.find('k') == string::npos){
	cout<< "문자열 없음";
}else{
	cout<< "찾음"
}

 

++ length() vs size()

둘 다 같은 값을 반환하지만 차이가 있다. 
 
length()는 NULL 값을 제외한 문자열의 길이를 반환한다 => NULL값이 포함되면 길이가 다를 수 있다. 
size()는 컨테이너의 크기를 반환하는 함수이다. > 벡터, 리스트, 배열 등의 다양한 컨테이너 타입에서 사용할 수 있다. 
테이너 자체에 크기 정보가 저장되어 있으므로, 크기를 직접 반환할 수 있음.
 
length() 는 O(N)
size() 는 O(1) 의 시간복잡도를 가짐 ㅎ... size()를 애용하자.