바킹독의 [실전 알고리즘] 0x03강 - 배열 정리.
-배열의 성질
- O(1)에 k번째 원소를 확인/변경 가능
시작 주소에서 k칸 만큼 오른쪽으로 가면 되기 때문. - 추가적으로 소모되는 메모리의 양(=overhead)가 거의 없음
다른 자료구조와 다르게 추가적으로 소모되는 메모리의 양이 거의 없다. - Cache hit rate가 높음
메모리 상에데이터들이 붙어 있으니까. - 메모리 상에 연속한 구간을 잡아야 해서 할당에 제약이 걸림
-시간 복잡도
- 임의의 위치에 있는 원소를 확인/변경 = O(1)
- 원소를 끝에 추가 = O(1)
- 마지막 원소를 제거 = O(1)
- 임의의 위치에 원소를 추가/임의 위치의 원소 제거 = O(N)
-배열 전체를 특정값으로 초기화
- for문으로 값을 하나하나 다 바꾸는 방식 : 무난
- algorithm 헤더의 fill함수 사용
int a[21];
fill(a, a+21, 0);
- STL Vector
배열과 거의 동일한 기능 수행하는 자료구조.
배열과 마찬가지로 원소가 메모리에 연속하게 저장되어 있기 때문에 O(1)에 인덱스를 가지고 각 원소로 접근할 수 있다. 그런데 vector는 배열과 달리 크기를 자유자재로 늘이거나 줄일 수 있다는 장점.
- insert, erase는 배열에서 우리가 구현한 것과 비슷하게 시간복잡도가 O(N)
- push_back, pop_back은 제일 끝에 원소를 추가하거나 빼는 것이니 O(1)
이 사실을 깜빡해서 잘못된 시간복잡도로 문제를 접근하는 경우를 막기 위해서 메소드의 시간복잡도를 잘 생각!
- vector에서 =를 사용하면 깊은 복사가 발생
vector<int> v3 = {1,2,3,4}
vector<int> v4;
v4 = v3; // {1,2,3,4} -> deep copy!
v4.pop_back(); // {1,2,3} -> v4를 바꿔도 v3에 영향 X
v4.clear(); // {}
- 연습문제들
https://jjpearl.tistory.com/46?category=1033721
[백준 - 10808번] [배열] 알파벳 개수
문제 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지
jjpearl.tistory.com
(0x01강의 연습문제)
주어진 길이 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,13,63,87 }, 4) = 1
포인트는 O(n^2) 알고리즘 말고 O(n) 알고리즘 풀이로 생각하는 것.
// 백준 알파벳 개수 문제랑 비슷한 알고리즘으로 풀면 됨.
// 숫자가 등장했는지 확인하는 배열을 확인하면 O(n) 시간 안에 풀 수 있다
// 핵심 포인트는 나와 합해서 100이 되는 수의 존재 여부를 O(N)이 아닌 O(1)에 알아차리는 것이고,
// 이걸 배열을 이용해서 해결할 수 있습니다. 그 방법은 바로 각 수의 등장 여부를 체크하는 배열을 만드는 것입니다.
// 이전에 등장한적 잇으면 1, 아니면 0
int func2(int arr[], int N)
{
int check[101] = {};
for (int i = 0; i < N; ++i)
{
if (check[100 - arr[i]])
return 1;
check[arr[i]] = 1;
}
return 0;
}
https://jjpearl.tistory.com/47
[백준 - 2577번] 숫자의 개수
문제 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오. 예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C
jjpearl.tistory.com
https://jjpearl.tistory.com/48
[백준 - 1475번] 방 번호
문제 다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다. 다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부
jjpearl.tistory.com
https://jjpearl.tistory.com/49
[백준 - 3273번] 두 수의 합
문제 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만
jjpearl.tistory.com
https://jjpearl.tistory.com/50
[백준 - 10807번] 개수 세기
문제 총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다.
jjpearl.tistory.com
'코딩테스트 및 개인공부 > 알고리즘' 카테고리의 다른 글
[강의정리] [연결리스트] 실전 알고리즘 0x04 정리 (0) | 2022.04.26 |
---|---|
[알고리즘] 그리디(탐욕법) 알고리즘 (Greedy Algorithm) (0) | 2021.11.23 |
[알고리즘] 완전탐색 (Exhaustive Search) (0) | 2021.07.06 |