티스토리 뷰
코딩테스트 알고리즘에서 자주 사용되는 vector 자료구조 활용방법에 대해 알아 보겠습니다.
해당 글에서는 값추가, 값제거, 값 정렬, 중복제거, 객체 추가, 객체 정렬에 대해서 설명하고 있습니다.
1. 값 추가
벡터는 배열처럼 크기가 정해져있지 않고 동적으로 값을 추가 할 수 있습니다.
벡터의 push_back(value)를 호출하여 값을 추가합니다.
vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(3);
numbers.push_back(3);
for (int i = 0; i < numbers.size(); i++) {
printf("%d ", numbers[i]);
}
실행 결과 0 1 2 2 3 3 3
2.값 제거
값의 제거는 pop_back()을 호출합니다. 제거의 경우 가장 뒤에 있는 값만 없어지게 됩니다.
위 코드에서 numbers.pop_back(); 을 한번 호출할 경우
실행결과로 0 1 2 2 3 3이 출력됩니다. 가장 끝에 있는 3이 사라지게 됩니다.
3.원하는 위치의 값 제거
하지만 원하는 특정위치의 값을 지우고 싶을 수도 있죠.
그럴때는 erase(제거시작지점, 제거 마지막지점) 을 호출합니다
그러면 원하는 위치부터 마지막지점의 직전 지점까지의 값을 벡터에서 제거할 수 있습니다.
vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(3);
numbers.push_back(3);
numbers.erase(numbers.begin() + 3, numbers.begin() + 5);
for (int i = 0; i < numbers.size(); i++) {
printf("%d ", numbers[i]);
}
printf("\n");
실행 결과 : 0 1 2 3 3
인덱스는 0부터 시작하기 때문에 결과로 4번째값인 2와 5번째값인 3이 없어졌습니다.
여기서 erase의 인자로 0이나 3 같은 정수를 입력할 경우 에러가 발생합니다.
반드시 0대신 vector.begin()으로 시작점을 나타내야합니다.
4.정렬
벡터를 정렬하기 위해서는 sort(시작지점, 끝지점, 정렬방식) 함수를 사용합니다.
단 반드시 #include <algorithm> 전처리문을 추가해야합니다.
sort(numbers.begin(), numbers.end(), greater<int>());
for (int i = 0; i < numbers.size(); i++) {
printf("%d ", numbers[i]);
}
printf("\n");
기본 정렬방식은 오름차순입니다. 위 코드에서 생성한 벡터는 이미 오름차순으로 정렬되어 있습니다.
그래서 greater<int>()를 정렬방식으로 지정해주면 내림차순으로 정렬이 가능합니다.
3번째 매개변수를 없앨 경우 기본 방식인 오름차순으로 정렬 할 수 있습니다.
실행결과 3 3 3 2 2 1 0
5.중복제거
중복된 값을 제거하기 위해서는 unique와 erase를 함께 사용하여야 합니다.
먼저 unique를 사용할 경우 중복된 값들을 벡터의 끝으로 보내게 됩니다.
그리고 뒤의 중복된 값들의 시작지점을 반환하게 됩니다.
여기서 반환받은 중복값들의 시작지점을 이용하여 erase를 호출하면 중복된값들을 제거 할 수 있습니다.
vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(3);
numbers.push_back(3);
vector<int>::iterator iter = unique(numbers.begin(), numbers.end());
numbers.erase(iter, numbers.end());
for (int i = 0; i < numbers.size(); i++) {
printf("%d ", numbers[i]);
}
printf("\n");
실행 결과 : 0 1 2 3
5.객체 추가
이제 단순한 정수 실수 등이 아닌 객체를 담아 보겠습니다.
class Object {
public:
int id;
int value;
};
struct Struct {
int id;
int value;
};
int main()
{
vector<Object> numbers;
for (int i = 0; i < 10; i++) {
Object obj;
obj.id = i;
obj.value = 10 - i;
numbers.push_back(obj);
printf("%d %d\n", numbers[i].id, numbers[i].value);
}
}
Object라는 클래스를 정의하고 객체를 벡터에 추가하였습니다.
실행결과
0 10
1 9
2 8
3 7
4 6
5 5
6 4
7 3
8 2
9 1
6.객체 벡터 정렬
벡터의 사용자 정의 객체를 추가 하였을 경우 sort를 사용했을 때 에러가 발생합니다.
여기선 추가적인 작업이 필요합니다.
위에서 sort의 3번째 매개변수는 정렬방식이라고 하였는데 사용자 정의 객체의 정렬을 위한 정렬방식을 만들어줘야합니다.
bool compare_value(Object a, Object b) {
return a.value < b.value;
}
int main()
{
vector<Object> numbers;
for (int i = 0; i < 10; i++) {
Object obj;
obj.id = i;
obj.value = 10 - i;
numbers.push_back(obj);
}
sort(numbers.begin(), numbers.end(), compare_value);
for (int i = 0; i < numbers.size(); i++) {
printf("%d %d\n", numbers[i].id, numbers[i].value);
}
}
Object의 value를 비교하기 위한 compare_value함수를 생성하고 sort의 세번째 매개변수로 지정하였습니다.
실행결과
9 1
8 2
7 3
6 4
5 5
4 6
3 7
2 8
1 9
0 10
여기서 부등호의 방향을 왼쪽으로 할 경우 내림차순으로 정렬 할 수 있습니다.
그리고 이처럼 각 객체의 id 멤버변수를 정해놓으면 정렬 후 객체들의 순서가 바뀌어도 초기 객체들의 순서를 알 수 있습니다.
7.이중 정렬
만약 정렬할 때 값이 같은 경우 또 다른 기준을 적용해서 정렬하고 싶을 수 있습니다.
이럴 때는 좀더 복잡한 비교함수를 생성하여 sort의 3번째 매개변수로 지정합니다.
bool compare_value(Object a, Object b) {
if (a.value == b.value)
return a.id < b.id;
else
return a.value < b.value;
}
만약의 객체의 value가 같을경우 초기의 입력 순서가 빠른것이 먼저 오도록 비교함수를 수정하였습니다.
'알고리즘' 카테고리의 다른 글
백준 2004 - 조합 0의 개수(상세풀이) (1) | 2020.02.13 |
---|---|
백준 9205 - 맥주 마시면서 걸어가기 (0) | 2020.02.09 |
백준 2178 - 미로 탐색 (0) | 2020.02.09 |
백준 6118번 - 숨바꼭질 (0) | 2020.02.07 |
백준 - 1012 유기농 배추 (0) | 2020.02.06 |
- Total
- Today
- Yesterday
- Jenkins Build Periodically
- 유니티
- c언어강의
- refusing to run with root privileges
- 유니티 직소퍼즐 구현
- Connecting Jenkins Agent
- 백준
- 젠킨스
- 알고리즘기초
- 안드로이드
- 빌드 주기
- Add Node
- 깃 용량문제
- 구글맵
- Jenkins
- C++
- 알고리즘
- 젠킨스 에이전트 연결
- Connecting Jenkins
- 언리얼 빌드
- C언어기초
- 안드로이드 구글맵
- 언리얼 기초
- c언어 기초
- 언리얼
- Unreal Header Tool
- 깃 허브 오류 해결
- UHT
- dfs
- 언리얼 사용자 정의 구조체
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |