IT 프로그래밍/객체지향프로그래밍

[c++] 중복 숫자 제거 벡터 사용

기술1 2024. 4. 17. 19:22
반응형

벡터를 사용하여 1~5까지 숫자 저장, 첫 번째 요소 3으로 바꾸는 것

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<int> v;
	for (int i = 1; i <= 5; i++)
		v.push_back(i);

	vector<int>::iterator it = v.begin();
	*it = 3;
	for (it = v.begin(); it != v.end(); ++it)
		cout << *it << " ";
	return 0;
}

 

여기서 1부터 5까지를 벡터에 추가해줍니다.  그리고 iterator 반복자 it를 선언해주는데요. 

 

vector<int>::iterator it = v.begin(); 은 벡터 v의 첫 번째 요소를 가리키는 반복자를 생성하는 역할을 합니다. begin() 함수는 벡터의 첫 번째 요소를 가리키는 반복자를 반환하고 이 반복자를 변수 it에 할당함으로써 벡터의 첫 번째 요소를 가리키는 반복자를 사용할 수 있게 됩니다. 

 

이후에는 *it = 3과 같이 해당 반복자를 통해 요소에 접근하고 값을 변경할 수 있습니다. 즉 위 코드에서는 벡터의 첫 번째 요소를 가리키는 반복자를 생성하고, 이를 사용하여 첫 번째 요소의 값을 3으로 변경하고, 모든 요소를 출력하는 것입니다. 

 

벡터 생성 및 반복자

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<string> vec;
	vector<string> vec2;
	vec.push_back("India ");
	vec.push_back("UP ");
	vec.push_back("Nodia ");
	vec2 = vec;
	vector<string>::reverse_iterator iter = vec2.rbegin();
	while (iter != vec2.rend())
	{
		cout << *iter;
		++iter;
	}
	return 0;
}

두 개의 문자열 벡터를 생성하고, 하나의 벡터를 다른 벡터로 복사한 후, 역방향 반복자를 사용하여 역순으로 요소를 출력하는 코드입니다. 

 

vector vec, vec2를 선언한 다음 push_back으로 각 문자를 입력을 해줍니다. 

 

그 다음 vec2 에 vec 의 모든 요소를 복사합니다. 그 다음 vector<string>::reverse_iterator iter = vec2.rbegin(); 을 통해 vec2 벡터의 역방향 반복자를 생성하여 iter에 할당합니다. 이때 역방향 반복자는 베겉의 마지막 요소를 가리킵니다. 

 

while문을 통해 첫 번째 요소를 가리키며 끝이 날 때까지 반복자를 합니다. 이렇게 하면 역순으로 출력이 되게 됩니다. 

 

중복된 숫자 제거 벡터 반환함수

 

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


vector<int> removeDuplicates(vector<int> nums)
{
	sort(nums.begin(), nums.end());

	auto it = unique(nums.begin(), nums.end());
	nums.erase(it, nums.end());


	return nums;
}

int main()
{
	vector<int> nums = { 1, 2, 3, 2, 4, 5, 3, 6 };
	vector<int> result = removeDuplicates(nums);
	for (int num : result)
		cout << num << endl;

	cout << endl;

	return 0;
}

위 문제 같은 경우 unique를 활용하여 간단하게 풀었습니다.

 

unique(nums.begin(), nums.end()) 를 사용하면 중복된 숫자를 다 뒤로 보내준 후 중복된 수 중 가장 앞에 있는 수의 주소를 return해주는데요. 그러면 그 값을 erase(it, nums.end())를 통해 제거를 해주시면 됩니다. 

 

그렇게 하면 깔끔하게 해결을 할 수 있습니다. 

 

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

using namespace std;

vector<int> unionVectors(vector<int> nums1, vector<int> nums2)
{
	vector<int> result;
	for (int i = 0; i < nums1.size(); i++)
		result.push_back(nums1[i]);
	for (int i = 0; i < nums2.size(); i++)
		result.push_back(nums2[i]);

	sort(result.begin(), result.end());
	auto it = unique(result.begin(), result.end());
	result.erase(it, result.end());

	return result;
}


int main()
{
	vector<int> nums1 = { 1, 2, 3 };
	vector<int> nums2 = { 3, 4, 5 };
	vector<int> result = unionVectors(nums1, nums2);

	for (int num : result)
		cout << num << " ";
	cout << endl;
	return 0;
}
반응형