자료구조 - Vector

최인규·2023년 6월 14일
1

자료구조

목록 보기
1/3
post-thumbnail

기본적으로 학습했던 자료들을 저장하는 자료구조인 배열에는 불편한 점들이 많다. (물론, 장점도 많음)

이번 포스팅에서는 배열의 불편한 점에 대해서 간략하게 살펴보고, 이를
보완하면서 C++에서 제공하는 STL인 벡터에 대해서 소개한 후 이를 직접 사용해본다. 중간에 백준 문제를 직접 이를 활용해서 해결해본다.

배열의 문제점.

1. 자료의 삽입과 삭제에 비효율적이다.

예를 들어서 생각을 해보자. 12345의 5개의 정수가 담긴 배열에서 2와 3사이에 6이라는 데이터를 넣고자 하면, 3부터 5까지의 자료는 모두 뒤로 한칸씩 밀어야하므로 이를 코드로 직접 구현하고자 한다면 상당히 복잡하다.
마찬가지로, 12345에서 3을 지운다고 하면 45는 앞으로 한칸씩 당겨야하므로 꽤나 귀찮은 코드를 작성해야한다.

2. 크기를 한 번 정하면 바꿀 수가 없다.

그동안 배열을 선언했던 경험을 되살려보면 다음과 같다.

int a[100] ;
char word[100];

해당 배열에 몇 개의 데이터가 들어갈 지 모르니 우선, 일정 크기의 배열을 선언해두고 각각의 인덱스마다 값을 사용하여 무언가의 조작을 해야만 했다.
문제는 선언한 크기보다 더 큰 수의 데이터들을 가져와야 할 때이다. 새롭게 배열을 정의해야한다는 매우 불편한 상황을 마주할 수 있다.

Vector의 선언과 사용.

위에서의 불편함들을 어느 정도는 보완한 자료구조로 Vector가 있다.
우선, 배열과는 다르게 직접적으로 insert, delete라는 함수를 활용하여 짧은 코드만으로도 원하는 위치와 데이터를 삽입, 삭제할 수 있다.
또한, 단순하게 선언만 해두고 (크기 직접 선언도 가능) push_back이라는 함수를 활용하여 필요할 때마다 값을 추가하는 방식으로 동적으로 사이즈를 조정할 수 있다는 편리함이 있다.

지금부터의 Code는 개인적으로 필자가 vector를 사용하는 방식에 편향되어 있다. 특히 모든 함수를 암기할 수는 없으므로 필요할 때마다 찾으면서 사용하면 되고, 한 번쯤 읽어보는 것이 큰 도움이 된다. 해당 REFERENCE 링크를 첨부한다.

https://cplusplus.com/reference/vector/vector/

우선 선언하는 방식은 다음과 같다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
	vector<int> x;

	return 0;
}

배열과 마찬가지로 저장하기를 원하는 data의 종류에 맞춰서 vector를 선언해주면 된다.

이제, Vector에 다양한 값들을 삽입해보자.

for (int i = 0; i < 5; i++)
{
	x.push_back(i);
}

선언한 벡터 자료구조에 0부터 4까지의 값이 자동으로 들어간다.

이제, Vector에서 가장 마지막에 들어간 값을 삭제해보자.

x.pop_back();

마지막에 들어간 4의 값이 삭제된다.

조금 앞서간 이야기이긴 하지만, Vector를 사용하는 이유는 다음에 등장할 Graph에서 인접리스트를 표현하는데에 매우 효율적이기 때문이다. 즉, 그때도 위에서 보여준 push_back(), pop_back() 정도를 많이 사용하므로 이 정도는 매우 익숙해지면 좋다. 앞으로 나올 insert나 erase의 경우에는 필자는 잘 사용하지 않으므로 아래 Reference를 참고하길 바란다.

https://medium.com/analytics-vidhya/vectors-in-c-a-beginners-guide-51ec40e641c3

Vector의 강력함.

다음 문제를 풀어보자. 쉬운 알고리즘 문제이다.

https://www.acmicpc.net/problem/2750

문제 자체는 크게 어렵지는 않다. 하지만, 사용자에게 숫자를 입력받은 후에 그만큼의 숫자를 입력받은 후에 정렬이라는 복잡한 과정이 필요하다.
C++에서는 Vector와 Algorithm STL을 활용하여 쉽게 정렬이 구현 가능하다.
코드와 함께 살펴보자

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	int n;
	cin >> n;

	vector<int> x;

	while (n--)
	{
		int temp;
		cin >> temp;
		x.push_back(temp);
	}

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

	//cout << x.size() << endl;
	for (int i = 0; i < x.size(); i++)
	{
		cout << x[i] << endl;
	}
	return 0;
}

배열에서는 직접 정렬의 코드를 작성해야하는 반면, Vector와 algorithm을 include를 한 후에 sort(시작, 끝)해주면 정렬이 끝난다.

0개의 댓글

관련 채용 정보