일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 2623
- LOLIN D32
- 9996
- 풀이
- TDD란?
- Vite 사용 이유
- 백준 2133
- 13459
- 메모리계층
- TDD
- 구현
- 자료구조
- 페이지교체알고리즘
- 1796
- mediastream
- 테스트주도개발
- ESP32
- RBT
- dp
- WebRTC란
- 구슬탈출
- 적두트리
- REACT
- tfjs
- stl
- OpenVidu
- c++
- 3XN 타일링
- 백준
- 데이터 링크 계층
- Today
- Total
그냥 블로그
[백준 / C++] 9996 한국이 그리울 땐 서버에 접속하지 본문
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()를 애용하자.
'C++ > 백준' 카테고리의 다른 글
[ 백준/C++ ] 2174 로봇 시뮬레이션 (1) | 2023.10.29 |
---|---|
[ 백준 / C++ ] 1181 단어 정렬 + sort() (1) | 2023.10.21 |
[ 백준/C++ ] 2468 안전 영역 (0) | 2023.10.12 |
[ 백준/C++ ] 나는야 포켓몬 마스터 이다솜 (1) | 2023.10.10 |
[백준/C++] 2559 수열 (1) | 2023.10.08 |