ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUNGOL...174
    일지 2022. 1. 4. 18:50

    Intermediate_Coder/그래프탐색-DFS/STL vector 2


    문제                                            

    이 튜토리얼에서는 벡터(vector)의 부가적인 기능을 마저 배우고,
    sort()등의 함수를 벡터(vector)에 어떻게 적용시키면 되는지를 배워보자.
    전편에서 다루었던 push_back()과 size() 기능은 제외한다.
    아래의 내용은 가장 중요한 엑기스만으로 구성되어 있으며, 이외의 기능들은 studylab등의 학습자료를 참고하여 차차 익히도록 하라.

    1. pop_back()

    배열의 마지막 원소 하나를 제거하여 배열의 크기를 1 줄인다.
    이미 크기가 0인 배열에서 이 함수를 호출하면 런타임 에러가 난다.

    예) 크기 4인 벡터(arr)가 [1,2,3,4]인 경우 arr.pop_back()을 적으면, 벡터가 [1,2,3]이 된다.

    2. resize()

    배열 크기를 원하는 크기로 변경하고싶다면, (벡터이름).resize(크기)를 쓴다.

    작은 크기에서 큰 크기로 변경할 경우 새로 생기는 공간은 0으로 초기화된다.
    예) 벡터(arr)가 [1,2,3,4] 인 경우, arr.resize(8)을 적으면, 벡터가 [1,2,3,4,0,0,0,0]이 된다.

    새로 생기는 공간을 0이 아닌 다른 값으로 초기화시키고싶으면, 두 번째 인자를 전달하면 된다.
    예) 벡터(arr)가 [1,2,3,4] 인 경우, arr.resize(8,1)을 적으면, [1,2,3,4,1,1,1,1]이 된다. 

    큰 크기에서 작은 크기로 변경하는 경우 뒤에서부터 제거된다.
    예) 벡터(arr)가 [1,2,3,4,5,6,7,8]인 경우, arr.resize(4)를 적으면 벡터가 [1,2,3,4]가 된다.

    3. 여러 가지 선언방법

    벡터를 그냥 선언하면 그 크기가 0이다.
    예) vector<char> arr; ///크기 0의 char형 배열을 선언한다.

    전편의 힌트에서 다루었듯, 벡터를 처음 선언할 때 크기를 선언할 수 있다.
    예) vector<int> arr(10); /// 크기 int형 10의 배열 선언. 처음 생긴 10개의 공간은 모두 0으로 초기화된다.

    resize()와 마찬가지로, 처음 생긴 공간을 0이 아닌 다른 값으로 초기화시키고 싶으면 두 번째 인자를 전달하면 된다.
    예) vector<double> arr(10,3.14); /// 크기 10의 double형 배열 선언. 처음 생긴 10개의 공간은 모두 3.14로 초기화된다.

    4. front(), back()

    각각 배열의 맨 앞, 맨 뒤의 원소를 반환한다.(정확히는 그 참조형을 반환하므로 변환이 가능하다.)
    arr.front() = 3; ///배열 맨 앞의 값을 3으로 바꿈. arr[0] = 3 과 동일
    arr.back()++; ///배열 맨 뒤의 값을 하나 증가시킴. arr[(int)arr.size()-1]++ 과 동일

    5.empty()

    벡터가 비어있을 때, empty()를 호출하면 true가 반환되며, 벡터에 원소가 한개 이상 들어있으면 거짓이 반환된다.
    주로 pop_back()이나 front(), 또는 back()을 사용하기 전에 확인해주면 좋다.

    예) if( !arr.empty() )arr.pop_back(); ///원소가 존재하는 경우에만 pop_back()!!

    6.(중요)벡터에 다른 STL 함수 (주로 sort()) 적용하기

    정적으로 선언된 일반 배열과 조금 다르다. sort()를 예로 들어보자.
    int형 배열을 정렬할때 어떻게 했었는지 기억이 나는가? 

    sort(arr,arr+n);

    이런 식으로 썼던 기억이 날 것이다. 여기서 arr은 배열이름, n은 배열의 원소 수이다.
    기억이 나지 않는다면, STL sort 튜토리얼을 복습하자.

    그러나 배열 arr이 크기가 변하는 배열, 즉 벡터라면, 위와 같이 쓰면 에러가 나게 된다.
    그 이유는 벡터 arr의 이름 자체는 주소로써의 역할을 하지는 않기 때문이다.
    (위 이탤릭체로 써 있는 문장은 애써 너무 이해하려고 노력할 필요는 없다. 그냥 벡터는 sort()사용방식이 배열과 다르다는 것만 알면 된다.)

    벡터 arr를 정렬하는 방식은 아래와 같이 쓰면 된다.

    sort(arr.begin(),arr.end());

    sort()를 예로 들었지만, 이 방식은 다른 함수에도 적용된다! 예를 들어 reverse()함수를 쓰고 싶다면,

    reverse(arr.begin(),arr.end());

    라고 쓰면 된다.

    연습문제

    초기 크기가 n인 정수형 벡터를 하나 만들고, 각 n개의 원소들의 초기값을 x로 초기화한다.
    그 후 다음 5가지 명령을 처리한 후 배열의 모든 원소를 출력하는 프로그램을 작성하라.

    i a: 현재 시점 벡터의 맨 뒤에 원소 a를 삽입하여 벡터의 크기를 하나 늘린다. (insert)
    r: 현재 시점 벡터의 맨 뒤에 있는 원소를 삭제하고, 벡터의 크기를 하나 줄인다. (remove)이때, 벡터의 크기가 0이면 아무 일도 하지 않는다.
    s: 현재 시점 벡터를 오름차순으로 정렬한다. (sort)
    t: 현재 시점 벡터의 맨 앞에 있는 원소와 맨 뒤에 있는 원소를 맞바꾼다.(trade) 이때 벡터의 크기가 0이면 아무 일도 하지 않는다.
    e: 현재 시점 벡터를 앞에서부터 출력하고, 프로그램을 종료한다.(end)​

     

    입력 형식                                     

    첫 줄에 n과 x가 주어진다.
    그 다음 줄에 5가지 명령 중 하나가 주어진다.e가 입력될때까지 계속된다.

    제약조건

    (0≤n≤10, 0≤x≤100, 000, 0≤(insert 명령으로 주어지는 정수 a)≤100, 000)
    주어지는 명령의 총 개수는 1, 000개 이하이다.

     

    출력 형식                                     

    마지막 명령이 주어질 때 벡터에 남아있는 원소를 앞에서부터 공백을 사이에 두고 출력한다.

    마지막엔 반드시 한 개 이상의 원소가 남아있음을 보장한다.

     

    입력 예                                        

    5 2
    r
    r
    i 6
    t
    r
    i 3
    i 10
    s
    i 8
    t
    e

     

    출력 예                                        

    8 2 3 6 10 2


    STLVector2.h

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using std::vector;

     

    STLVector2.cpp

    void STLVector2::Code()
    {
    	int n, x;
    	std::cin >> n >> x;
    
    	vector<int> v(n, x);
    
    	while (true)
    	{
    		char c;
    		std::cin >> c;
    
    		if (c == 'e')
    		{
    			break;
    		}
    
    		switch (c)
    		{
    		case 'i':
    			int num;
    			std::cin >> num;
    			v.push_back(num);
    			break;
    		case 'r':
    			if (!v.empty())
    			{
    				v.erase(--v.end());
    			}
    			break;
    		case 's':
    			std::sort(v.begin(), v.end());
    			break;
    		case 't':
    			if (!v.empty())
    			{
    				int temp{ v.front() };
    				v[0] = v.back();
    				v[v.size() - 1] = temp;
    			}
    			break;
    		}
    	}
    
    	for (int val : v)
    	{
    		std::cout << val << ' ';
    	}
    }

     


    실행 결과 Success(100)


     

    NadanKim/CodingTest_JUNGOL: JUNGOL 코딩 테스트를 위한 저장소 (github.com)

     

    NadanKim/CodingTest_JUNGOL

    JUNGOL 코딩 테스트를 위한 저장소. Contribute to NadanKim/CodingTest_JUNGOL development by creating an account on GitHub.

    github.com

     

    댓글

Designed by Tistory.