-
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)