Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
| 31 |
Tags
- 코딩테스트준비
- 티스토리챌린지
- 항해99
- 코테 파이썬
- 라라벨
- 백준
- Python
- vue
- DP
- Flutter
- C++
- 오블완
- react
- 개발자취업
- ML
- c++ 코테
- Laravel
- 파이썬 코테
- flutter getx
- 파이썬
- 코테
- 코딩테스트 준비
- 뷰
- 99클럽
- 플러터
- til
- 코딩테스트
- 개발자 취업
- 안드로이드
- 알고리즘
Archives
- Today
- Total
잡다로그
[C++/코테] 배열과 Vector 본문
배열은 데이터를 자주 바꾸지 않고 그냥 쌓아두고 싶을 때 활용할 수 있다.
입력을 담아두기 위해 많이 사용.
배열의 성질
- $O(1)$에서 k번째 원소를 확인/변경 가능하다.
- 추가적으로 소모되는 메모리의 양(overhead)가 거의 없다.
- Cache hir rate가 높다.
- 메모리 상에서 연속한 구간을 잡아야 해서 할당에 제약이 걸린다.
배열의 연산
$O(1)$
- 임의의 위치에 있는 원소를 확인/변경
- 원소를 끝에 추가
- 마지막 원소를 제거
$O(N)$
- 임의의 위치에 원소를 추가 - 평균적으로 N/2개의 원소가 밀리기 때문
- 임의의 취이에 있는 원소를 제거
배열 사용팁
배열 전체를 특정 값으로 초기화하기
- cstring 헤더에 있는 memset 함수를 활용하는 방식 (비추)
- for문을 사용해서 하나하나 바꿔주는 것
- algorithm 헤더의 fill 함수 사용
벡터
배열과 달리 크기를 자유자재로 늘리거나 줄일 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
vector<int> v1(3, 5);
cout << v1.size() << '\n';
v1.push_back(7);
vector<int> v2(2);
v2.insert(v2.begin() + 1, 3);
vector<int> v3 = {1, 2, 3, 4};
v3.erase(v3.begin() + 2); // {1, 2, 4}
vector<int> v4;
v4 = v3; // {1, 2, 4}. = 을 사용하면 deep copy가 발생
cout << v4[0] << v4[1] << v4[2] << '\n';
v4.pop_back(); // {1, 2}
v4.clear();
}
$O(1)$
- push_back
- pop_back
$O(N)$
- insert
- erase
- push_front
- pop_front
vector에 있는 모든 원소를 순회하려고 할 때, range-based for loop를 이용할 수 있다.
vector<int> V1 = {1, 2, 3, 4, 5, 6};
// range-based for loop (since C++ 11)
for (int e : V1) // V1의 복사본이 들어가서, 원본에는 영향 X
cout << e << ' ';
기초적인 for문을 사용할 수도 있다.
vector<int> V1 = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < V1.size(); i++)
cout << V1[i] << ' ';
* vector는 size를 unsigned int 형으로 반환한다.
연습문제
주어진 길이 N의 int 배열 arr에서 합이 100인 서로 다른 위치의 두 원소가 존재하면 1을, 존재하지 않으면 0을 반환하는 함수 func2(int arr[], int N) 을 작성하라. arr의 각 수는 0 이상 100 이하이고 N은 1000 이하이다.
func2({1, 52, 48}, 3) = 1
func2({50, 42}, 2) = 0
func2({4, 14, 63, 87}, 4) = 1
int func2(int arr[], int N)
{
int occur[101] = {};
for (int i = 0; i < N; i++)
{
if (occur[100 - arr[i]] == 1) // if (occur[100 - arr[i]]) 로만 적어도 됨
return 1;
occur[arr[i]] = 1;
}
return 0;
}
나다어
- 값 자체를 찾아보려면 $O(N)$의 복잡도를 피할 수 없지만, 값을 배열의 인덱스로 사용하면 인덱스 검색에 $O(1)$의 복잡도로 문제를 해결할 수 있다.
'Algorithm' 카테고리의 다른 글
| [Python/코테] 백준 2445번 별 찍기 (0) | 2023.11.08 |
|---|---|
| [Python/코테] 백준 15552번 빠른 A+B (0) | 2023.11.08 |
| [C++/코테] 기초 코드 작성 요령 (2) (0) | 2023.11.06 |
| [C++/코테] 기초 코드 작성 요령 (0) | 2023.11.04 |
| [Python/코테] 다이나믹 프로그래밍(3) - 예제: 효율적인 화폐 구성 (0) | 2023.09.28 |
Comments