1. 그래프
정점(vertex)와 간선(edge)로 이루어진 자료구조. (무)방향 그래프. 간선에 가중치 부여 가능.
완전 그래프 : 모든 정점끼리 연결된 그래프. 정점의 개수 n -> 간선 수 n(n-1)/2
사이클 : 첫 정점과 마지막 정점이 동일한 경로가 존재하는 그래프. 다만 같은 정점을 두 번 이상 지나는 경로는 보통 사이클로 보지 않는다.
1-1. 그래프를 표현하는 방법(인접 행렬)
이차원 배열, i에서 j로 가는 간선이 있다면 arr[i][j] = 1;
직관적이다.
1-2. 그래프를 표현하는 방법(인접 리스트)
i와 연결된 노드들을 리스트 형태로 저장. (ex. 1번 노드가 2번, 3번 노드와 연결 : 헤더 1 to 2 -> 2 to 3 -> 3 to NULL)
행렬보다 공간복잡도가 낮다.
2. 트리
나무를 뒤집은 모양의 자료구조. 그래프의 한 종류.
노드의 종류 : 부모 노드, 자식 노드, 형제 노드 ...
이진 트리 : 모든 부모 노드의 자식 노드의 개수가 최대 2개인 트리.
3. 탐색
3-1. DFS(Depth First Search)
stack으로 구현. 더이상 갈 수 없을 때까지 전진. 막히면 막히지 않은 곳이 나올 때까지 후진. 그리고 다시 직진. 반복.
3-2. BFS(Breadth First Search)
queue로 구현. 노드에서 갈 수 있는 모든 노드로 전진. 다시 전진한 모든 노드에서 갈 수 있는 모든 노드로 전진. 반복.
3-3. 이진 탐색 트리
왼쪽 서브트리 노드 값은 부모 노드보다 작은 값
오른쪽 서브트리 노드 값은 부모 노드보다 큰 값
4. set
중복을 혀용하지 않는 자료구조.
5. map
key와 value를 쌍으로 저장하는 자료구조.
6. 우선순위 큐
우선순위가 높은 원소부터 pop하는 자료구조.
6-1. priority_queue
원소 값이 큰 것부터 pop
1927번 최소 힙 문제 힌트 : priority_queue는 최대힙을 기준으로 만들어 졌다. 따라서 -1을 곱하면 가장 작은 원소부터 pop할 수 있다.
7. STL min/max
initialize lists를 이용한 배열을 넣으면 세 개 이상의 값 비교가 가능하다. (since C++11)
8. min_element/max_element
배열에서 최소/최대 값을 가진 iterator를 return
9. STL string
C++에서 문자열을 다루기 쉬워짐. #include <string>
C 문자열(char*)로 바꾸려면 c_str()을 사용. ( string alpha="abc"; printf("%s\n", alpha.c_str()); )
string으로 전환 : to_string()
string에서 전환 : stoi(), stoll(), stod()
10. 숙제 문제 solution 중 STL
10-1. vector
vector<vector<int>> adj;
adj.resize(n, vector<int>(n));
10-2. set, map
set<int> s; s,insert(x);
map<string, string> girlmap; girlmap[name]=group; cout << it.first;
10-3. queue
priority_queue<int> q; q.top();
10-4. min, max
min({a, b, c}), max({a, b, c}); //{}은 배열 선언할 떄 많이 봤는데, min, max에 배열을 넣어도 작동할까?
10-5. min_element, max_element
cout << *min_element(a.begin(), a.end());
10-6. string
s.size(); stoi(s); stoll(s); stod(s); to_string(arr); getline(cin, s); getline(cin, s, ',');