https://www.acmicpc.net/problem/30034
제목 : Slice String
solved.ac 난이도 : Bronze I

길이가 S인 문자열이 주어지면 위 규칙에 따라 문자열을 잘라 한 줄씩 출력하면 됩니다.
공백을 포함한 구분자를 넣는 vector 와 병합자를 넣는 vector를 만들어서 각각을 저장하고,
병합자에 있는 문자가 구분자에 있으면 구분자 vector에서 모두 지워 버립니다.
지우고 남은 구분자로 문자열을 잘라주면 됩니다.
임시 벡터에 자른 문자열을 넣고 배열을 복사 하여 계속 자르는 식으로 진행을 하였습니다.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void slice(vector<string> &sliced, char c) {
vector<string> tmp;
string t;
for (int i = 0; i < sliced.size(); i++) {
stringstream ss(sliced[i]);
while (getline(ss, t, c)) {
tmp.push_back(t);
}
}
sliced.clear();
sliced.assign(tmp.begin(), tmp.end()); // 벡터 복사
}
void deletechar(vector<char>& slice, vector<char>& merge) {
// 구분자 벡터에서 병합자 벡터의 데이터를 지움. 중복이 들어올 수도 있어서 찾아서 없을 때 까지 지운다.
for (int i = 0; i < merge.size(); i++) {
while(find(slice.begin(), slice.end(), merge[i]) != slice.end()) {
slice.erase(find(slice.begin(), slice.end(), merge[i]));
}
}
}
int main()
{
string s;
char c;
int N, M, K, S;
vector<char> slicechar = { ' ' };
vector<char> mergechar;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> c;
slicechar.push_back(c);
}
cin >> M;
for(int i = 0; i < M; i++) {
cin >> c;
slicechar.push_back(c);
}
cin >> K;
for (int i = 0; i < K; i++) {
cin >> c;
mergechar.push_back(c);
}
deletechar(slicechar, mergechar);
vector<string> sliced;
cin >> S;
cin.ignore();
getline(cin, s);
sliced.push_back(s);
for (char c : slicechar) {
slice(sliced, c);
}
for (string i : sliced) {
if(i != "") cout << i << "\n";
}
}
중간에 cin.ignore()을 하는 이유는 cin을 사용하면 '\n'을 처리하지 않고 버퍼에 남겨둡니다. 그래서 getline에서 새로 문자열을 받으려면 cin에 남아있는 '\n' 버퍼를 지워야 합니다. 그래서
cin.ignore()을 통해 맨 앞에 남은 문자열 한개를 지워 제대로 문자열을 받게 됩니다.
