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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | //임시 버퍼가 허용되면 set을 사용해서 해결할 수 있겠다. #include "stdafx.h" #include <iostream> #include <list> #include <unordered_set> #include <cstdlib> #include <ctime> #include <set> using namespace std; int main() { srand(time(NULL)); // 순서를 유지해야 하나요 ? >> 네 // 첫 번째로 나타나는 원소만 남길까요? >> 네 // 리스트의 데이터형은 char로 해도 괜찮나요? >> 네 // 리스트가 STL list로 주어져 있다고 가정해도 되나요? >> 네 list<char> data; for (int i = 0; i < 100; i++) { data.push_back(rand() % 26 + 'a'); } list<char>::iterator it; for (it = data.begin(); it != data.end(); it++) { cout << *it << " "; } cout << endl<<endl; set<char> buffer; /* for (it = data.begin(); it != data.end(); it++) { if (buffer.find(*it) == buffer.end()) { buffer.insert(*it); } else { list<char>::iterator tmp = it; advance(tmp, -1); data.erase(it); //data.erase(it--)으로 해결가능.. it = tmp; } } */ for (int i = 0; i < data.size(); i++) { it = data.begin(); advance(it, i); if (buffer.find(*it) == buffer.end()) { buffer.insert(*it); } else { data.erase(it); i--; } } for (it = data.begin(); it != data.end(); it++) { cout << *it << " "; } cout << endl << endl; while(1){} return 0; } |
without buffers
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | void removeduplicate(list<char> & data) { // 이중 search O(N^2) 알고리즘 가능하다. // 26 letters라는 사실을 이용할 수 있나? >> 일단 별 방법이 안 보인다 // 오!! O(N) 방법이 있다.. a ~ z까지 돌면서 지우는 방법.. // 버퍼를 쓸 수 없다는게 단일 변수도 사용 불가능한지? list<char>::iterator it; for (int i = 0; i < 26; i++) { bool done = false; for (int j = 0; j < data.size(); j++) { it = data.begin(); advance(it, j); if (*it == ('a' + i)) { if (done == false) { done = true; } else { data.erase(it); j--; } } } } } void removeduplicate2(list<char> & data) { list<char>::iterator it; for (it = data.begin(); it != data.end(); it++) { for (list<char>::iterator it2 = data.begin(); it2 != it; it2++) { if (*it2 == *it) { //list<char>::iterator tmp = it; //it--; data.erase(it--); // it 이터레이터를 삭제하기 전에 연산을 해주나? break; } } } } void removeseconds(list<char> &data) { bool tg = false; for (list<char>::iterator it = data.begin(); it != data.end(); it++) { if (tg == false) { tg = true; } else { data.erase(it--); tg = false; } } } | cs |