가득찬 공간에 원소 추가하려면 더 큰 배열 생성 후 기존 배열의 원소를 복사한 후 새 원소 추가
숫자 인덱스를 기반으로 랜덤 접근이 가능하고 중복을 허용한다.
vector와 달리 메서드가 없다.
C++ 선언타입
C스타일
1 2 3 4
int a[10]
// 할당 int b[] = {1,2,3}
배열의 크기를 정하여 선언 가능
크기를 정하지 않고 선언하면서 중괄호 요소들을 할당할 수 있다.
std스타일
1
array<int, 10> a;
동적배열
정적 배열의 특징을 가지면서 가변적인 특징이 더해짐
참조: O(1)
탐색: O(n)
맨끝에서 삽입 / 삭제: O(1)
맨 끝 제외 삽입 / 삭제: O(n)
ex) 파이썬의 리스트
C++ 선언방식
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
vector<타입> 변수명;
vector<int> b;
// 크기 미리 정하거나 해당 크기의 어떤 값으로 초기화 가능 #include<bits/stdc++.h> usingnamespace std; vector<int> v(5, 100); intmain(){ for (int a : v) cout << a << " "; cout << "\n"; return0; } /* 100 100 100 100 100 */
defsolution(arr,s): for i inrange(len(arr)): sum = s for j inrange(i,len(arr)): sum -= arr[j] if (sum == 0): return [i+1,j+1]
2-1. O(n) 시간복잡도로 풀기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
defsolution(arr,s): sum = s index = 0 position = 0 whilesum != 0: if position == len(arr) - 1: return [-1] sum -= arr[position] ifsum < 0: index += 1 position = index sum = s continue position += 1 return [index+1,position]
sum에 s를 할당하여 position 위치의 요소를 하나씩 빼면서 sum 값이 0 보다 작은지 체크
0 보다 작다면 연속되는 부분합이 아니므로 리셋시켜주고 시작 index도 우측으로 이동시킨다.
만약 시작 index가 배열의 끝까지 도달했는데도 sum이 0이 되지 않으면 연속되는 부분합을 만들 수 없다.
2-2. O(n) 시간복잡도로 풀기
1 2 3 4 5 6 7 8 9 10
defsolution(arr,s): left,sum = 0,0 for right inrange(len(arr)): sum += arr[right] while (left < right andsum > s): sum -= arr[left] left += 1 ifsum == s: return [left+1,right+1] return [-1]
배열의 첫번째 요소부터 하나씩 sum에 더해준다.
sum이 s보다 작거나 같으면 계속 배열의 요소를 더해준다.
sum > s를 만족하면, sum에 left 위치의 요소를 빼주면서 sum이 s보다 작거나 같으면 중단
이 때, sum == s를 만족하면 [left+1, right+1]을 반환한다.
left == right 일 때, sum == s를 만족하지 않으면 연속되는 부분합이 없다.
defget_increased_arr(arr): left = 0 right = len(arr) - 1
while left < right: while arr[left] == 0: left += 1 while arr[right] == 1and right >= 0: right -= 1 if left < right: arr[left], arr[right] = 0, 1 left, right = left + 1, right + 1 return arr