Vector a 에서 vector b와 겹치는 인자를 제거한 결과를 반환하는 함수 이다.


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
 
#include<iostream>
#include<vector>
using std::cout;
using std::endl;
using std::vector;
 
vector<int> duplication(vector<int>& a, vector <int>& b) {
    vector<int>::iterator iter;
    vector<int>::iterator iter_b;
    vector<int> c = a; //a의 값 복사
    
    for (iter_b = b.begin(); iter_b != b.end(); iter_b++) {
        for (iter = c.begin(); iter != c.end();) {
            if (*iter == *iter_b)
                iter = c.erase(iter); //중복 제거
            else
                iter++;            
        }        
    }
    return c; //결과 반환
}
 
int main() {
    vector<int> a;
    vector<int> b;
 
    a.push_back(1);
    a.push_back(3);
    a.push_back(-1);
    a.push_back(11);
    a.push_back(-5);
    
    b.push_back(-1);
    b.push_back(-5);
    b.push_back(4);
 
    vector<int> c = duplication(a,b); //a에서 b와 겹치는 인자 제거한 결과 반환
    
    //원본 a출력
    for (vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter) 
        cout << *iter <<" ";
    cout << endl;
 
    //b와의 중복 제거된 c출력
    for (vector<int>::iterator iter = c.begin(); iter != c.end(); ++iter) 
        cout << *iter << " ";    
    cout << endl;
 
    return 0;
}
 
cs


- 출력 결과 -



1 3 -1 11 -5

1 3 11

Posted by 꿈만은공돌
,



C++ 에서 표준 템플릿 라이브러리인 STL(Standard Template Library)의 가장 기본적인 시퀀스 컨테이너인 vector에 대해서 설명하겠습니다.

기본적으로 배열과 비슷한 부분이 많이 있습니다.

#include<vector> 헤더파일을 포함시켜 주시고 사용하면 됩니다.

선언을 할때 vector<int> v와 같은 방식으로 선언을 하며 크기를 vector<int> v(10) 과 같이 임의 지정할 수도 있습니다.

vector에 저장할 수 있는 크기가 있으며 그것을 초과 할 경우 vector에 인자들을 복사하여 다른 메모리에 할당하면서 크기를 늘립니다.



1. 기본 선언과 인자 추가 , 탐색

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
#include<iostream>
#include<vector>
using std::cout;
using std::endl;
using std::vector;
 
int main() {
    //선언
    vector<int> v;

    //가장뒤에 인자추가
    v.push_back(5);        // [5]
    v.push_back(15);    // [5, 15]
    v.push_back(25);    // [5, 15, 25]
    v.push_back(1);        // [5, 15, 25, 1]
    
    //탐색
    for (unsigned int i = 0; i < v.size(); i++) {
        cout << v[i] << endl;
    }
    
    cout << "----------"<<endl;
                     
    //탐색2 iterator 이용하기
    vector<int>::iterator iter;
    for (iter = v.begin(); iter != v.end(); iter++) {
        cout << *iter << endl;
    }
    return 0;
}







2. size() 와 clear()

1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    vector<int> v;
    v.push_back(-11);        
    v.push_back(-22);
    v.push_back(33);
    
    //사이즈 측정 및 초기화 함수
    cout << v.size() << endl;    // 3 출력
    v.clear();                    // vector 내용 초기화
    cout << v.size() << endl;    // 0 출력
    return 0;
}





3. 중간에 인자 넣기( insert())

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main() {
    vector<char> v;
    v.push_back('a');
    v.push_back('b');
    v.push_back('d');
    v.push_back('e');
 
    //b 다음에 c 삽입하기
    vector<char>::iterator iter;
    for (iter = v.begin(); iter != v.end(); ++iter) {
        if (*iter == 'b') {    //b찾기
            v.insert(iter+1'c');    //b다음에 c 삽입하기
            break;
        }
    }
 
    //결과 출력
    for (iter = v.begin(); iter != v.end(); ++iter) {
        cout << *iter << endl;
    }
    return 0;
}





4. 인자 삭제하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main() {
    vector<double> v;
    v.push_back(1.1);
    v.push_back(3.3);
    v.push_back(-1.3);
    v.push_back(11);
    v.push_back(-5);
 
    //음수 제거하기
    vector<double>::iterator iter;
    for (iter = v.begin(); iter != v.end(); ) {
        if (*iter < 0) {            // 음수 찾기
            iter = v.erase(iter);    // 인자 삭제, 삭제 후 다음 인자 반환
        } else {
            ++iter;
        }
    }
 
    //결과 출력
    for (iter = v.begin(); iter != v.end(); ++iter) {
        cout << *iter << endl;
    }
    return 0;
}





Posted by 꿈만은공돌
,


1부터 n까지 합을 구하는 두 가지 함수 코드 비교 입니다.


작성 언어는 C++이면 c언어에서 사용할 때는 cout endl 함수를 printf 로 변경하시면 됩니다.


sum 함수와 recursive 함수의 경우 언어에 상관없이 가져다 쓰시면 됩니다.


- 예  제 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using std::cout;
using std::endl;
 
int sum(int n) { //1부터n까지의 합(for)
    int sum = 0;    //초기화
    for (int a = 1; a <= n; a++)
        sum += a;
    return sum;
}
 
int recursiveSum(int n) { //1부터n까지의 합(재귀)
    if (n == 1//탈출 조건
        return 1;
    else
        return n + recursiveSum(n - 1); //재귀호출
}
 
int main() {
    cout << "sum(for) : " << sum(4000)<<endl;
    cout << "sum(재귀) : " << recursiveSum(4000<< endl;
    return false;
}



Posted by 꿈만은공돌
,

프로그래밍을 하다보면 딜레이가 발생하거나해서 어느 부분이 느린지 알아내야 하는 경우가 생길 수 있습니다.


또는 알고리즘을 공부하다보면 내가 구현한 알고리즘의 속도를 알고싶을 때가 있습니다.


그럴때 특정 구간에 코드 실행시간을 알아야내야 하는 경우에 필요한 포스팅 입니다.


JAVA에서 코드에 실행 시간을 측정하거나 특정 구간에 시간이 얼마나 소요되는지를 알고 싶을때 사용하는 코드 입니다.


현재 시간을 받아오는 System 함수인 System.currentTimeMillis() 함수를 이용하면 쉽게 구할 수 있습니다.

시작 구간과 끝나는 구간에 각각 해당 함수를 써서 시간을 받아오고 두 시간간의 차이를 계산하면 ms 단위의 시간차를 구할 수 있습니다.


ms를 초(s)로 변환하고 싶다면 /1000을 해주면 됩니다.

추가로 초(s)를 분(m) 구하고 싶다면 /60을 추가로 해주면 됩니다.




- 사용 방법 -

1
2
3
4
5
6
7
long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
//실험할 코드 추가
        
long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long secDiffTime = (afterTime - beforeTime)/1000//두 시간에 차 계산
System.out.println("시간차이(m) : "+secDiffTime);



- 사용 예시 -

1
2
3
4
5
6
7
8
9
10
11
12
13
long beforeTime = System.currentTimeMillis();
        
int sum = 0;
for (int i = 0; i < 1000000; i++) {
    for (int j = 0; j < 50000; j++) {
        sum += i*j;
    }
}
System.out.println(sum);
    
long afterTime = System.currentTimeMillis(); 
long secDiffTime = (afterTime - beforeTime)/1000;
System.out.println("시간차이(m) : "+secDiffTime);




- 출력 결과 -

1636142336 

시간차이(m) : 19

Posted by 꿈만은공돌
,





프로그래밍을 하다보면 딜레이가 발생하거나해서 어느 부분이 느린지 알아내야 하는 경우가 생길 수 있습니다.

또는 알고리즘을 공부하다보면 내가 구현한 알고리즘의 속도를 알고싶을 때가 있습니다.

그럴때 특정 구간에 코드 실행시간을 알아야내야 하는 경우에 필요한 포스팅 입니다.

C언어, C++에서 프로그램 실행시간을 측정하는 방법은 두 가지가 있습니다.




1. time 함수를 이용한 방법

우선 time 함수를 이용한 방법 입니다.

time(NULL) 함수를 이용하여 받아옵니다.

단점은 ms단위가 아닌 초(s) 단위로 측정이 됩니다.

#include <time.h> 헤더파일을 포함시키고 아래와 같이 사용하시면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <time.h>
 
int main() {
    time_t start, end;
    double result;
    int i, j;
    int sum = 0;
 
    start = time(NULL); // 시간 측정 시작
 
    for (i = 0; i < 100000; i++) {
        for (j = 0; j < 10000; j++) {
            sum += i * j;
        }
    }
 
    end = time(NULL); // 시간 측정 끝
    result = (double)(end - start);
    printf("%f", result); //결과 출력
    return 0;
}




2. clock 함수를 이용한 방법

clock 함수를 이용하여 앞에 방법의 단점을 해결하여 ms 단위로 시간을 측정 할 수 있습니다.
time 함수와 마찬가지로 include<time.h> 헤더 파일을 포함 시켜야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <time.h>
 
int main() {    
    clock_t start, end;
    double result;
    int i,j;
    int sum = 0;
 
    start = clock(); //시간 측정 시작
    
    for (i = 0; i < 100000; i++) {
        for (j = 0; j < 10000; j++) {
            sum += i * j;
        }
    }
 
    end = clock(); //시간 측정 끝
    result = (double)(end - start);
    printf("%f", result);
    return 0;
}



clock 함수는 아래와 같이 1초 1000 clock으로 정의되어 있습니다.
따라서 1clock은 1ms 입니다.
Visual studio 에서 clock 함수에서 F12를 누르면 아래와 같은 정의를 볼 수 있습니다.





Posted by 꿈만은공돌
,