카테고리 없음

delete duplicate letters in list

fw93 2018. 3. 23. 22:03
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;
}

cs


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