*C++์ ์๋ ์ ์ฉํ STL
#include <vector>
// vector : T type data๋ฅผ containํ๋, ํฌ๊ธฐ๊ฐ ์ ํด์ง์ง ์์ ๋ฐฐ์ด
vector< T > name; //์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ธ
name.begin() //์์ iterator(์ฃผ์ ๊ฐ๋
) ๋ฐํ
name.end() //๋ iterator(๋ ์ฃผ์+1) ๋ฐํ
name.size() // name์ ๋ค์ด์๋ ์์์ ์ ๋ฐํ
name.resize(int a, T b) //name์ ํฌ๊ธฐ๋ฅผ a๋ก ์กฐ์ , ๋น ์นธ์ b๋ก ์ด๊ธฐํ(b ์๋ต ๊ฐ๋ฅ, 0์ผ๋ก ์ด๊ธฐํ)
name.empty() //name์ด ๋น์๋ค๋ฉด true, ์์๊ฐ ์๋ค๋ฉด false ๋ฐํ
name[i] //name์ i๋ฒ์งธ ์์์ ์ ๊ทผ
name.front() // name์ ์ฒซ๋ฒ์งธ ์์์ ์ ๊ทผ
name.back() // name์ ๋ง์ง๋ง ์์์ ์ ๊ทผ
name.push_back(T a) //name ๊ฐ์ฅ ๋ค์ a ์ถ๊ฐ
name.pop_back() // name ๊ฐ์ฅ ๋ค ์์ ์ญ์ (๋ฉ๋ชจ๋ฆฌ๊น์ง ๊ฐ์ด ์ญ์ )
iterator ๋?
" An iterator is an object that can iterate(navigate) over elements "
์ดํฐ๋ ์ดํฐ๋ ์ปจํ ์ด๋์ ์์๋ค์ ์ํํ ์ ์๋ ๊ฐ์ฒด์ด๋ค.
ํน์ ์ผ์ข ์ ํฌ์ธํฐ๋ก์, ์ปจํฐ์๋์ ํน์ ์ ์์น๋ฅผ ๊ฐ๋ฅดํจ๋ค.
[์ถ์ฒ] [STL] Iterator (๋ฐ๋ณต์) ์ ๋ฆฌ ๋ฐ Iterator ํจํด ๊ตฌํ|์์ฑ์ ํธ๋ก์์ด์ด
#include <algorithm>
// sort : ์ํ๋ ๊ตฌ๊ฐ์ Comp์ ๋ฐ๋ผ ์ ๋ ฌ
sort(RandomAccessIter first, RandomAccessIter Last, Compare comp) //๊ผด๋ก ์ฌ์ฉํ ์ ์์
//[first, last) ๊ตฌ๊ฐ์ ์ ์ฉ
//comp๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์์ฑํ comp์ ๋ฐ๋ผ ์ ๋ ฌํ๊ณ , comp๋ฅผ ์๋ตํ ๊ฒฝ์ฐ Opertor < ์ ๋ฐ๋ผ ์ ๋ ฌ(์ค๋ฆ์ฐจ์)
//i.e. ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํ๋ comp ํจ์
bool comp(int a, int b){
return a>b;
}
์คํฐ๋ ๋ฃ๊ณ ์ด์ฌํ ์ดํดํด๋ณด๋ ค ํ์ง๋ง ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค. c++์ ์ ์จ๋ด์..! ์ฐจ์ฐจ ์ดํดํ๊ฒ ๋๊ฒ ์ง
์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๊ตฌํ
: MAX๊ฐ์ NODE๊ฐ ์๊ณ ๊ฐ์ ์ ์ ๋ณด๊ฐ M์์ S,E๋ก ์ฃผ์ด์ง(S์ E๊ฐ ์ฐ๊ฒฐ๋จ), ๊ทธ๋ํ์ ๋ฐฉํฅ์ฑ X
-์ธ์ ํ๋ ฌ์ ๊ตฌํ
int adj[MAX][MAX] = {};//๊ฐ์ ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int S, E;
for (int i = 0; i < M; i++) {
scanf("%d %d", &S, &E);
adj[S][E] += 1; //S์ E๊ฐ ์ฐ๊ฒฐ๋์์ผ๋ฉด ๋ฐฐ์ด์ 1 ์ฆ๊ฐ
if (S != E) adj[E][S] += 1; //๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ์ด๋ฏ๋ก S๋ E๊ฐ ๊ฐ์ง ์์ผ๋ฉด(์๊ธฐ ์์ ์ผ๋ก ๋์์ค๋ ๋ฃจํ๊ฐ ์๋๋ฉด) ๋ฐ๋ ๊ฒฝ์ฐ๋ 1์ฆ๊ฐ
}
}
-์ธ์ ๋ฆฌ์คํธ์ ๊ตฌํ
vector<int> adj[MAX]; //ํ์ฅ๊ฐ๋ฅํ vector๋ค์ ๋ฐฐ์ด์ ๋ง๋ฆ
int S, E;
for(i=0; i<M; i++){
scanf("%d %d",&S,&E);//C++์ด์ด์ผ ํ๋๋ฐ C++๋ฌธ๋ฒ์ ๋ชจ๋ฅด๋ฏ๋ก C์ธ์ด๋๋ก ๊ฐ๋ค.
adj[S].push.back(E); //S์ E๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด adj[S]์ E๋ฅผ ์ถ๊ฐ
if(S != E) adj[E].push_back(S); //๋ฃจํ์ผ ๋ ์ ์ธํ๊ณ ๋ฐ๋๋ก๋ ์ฐ๊ฒฐ
}
for(i=0;i<M;i++) sort(adj[i].begin(), adj[i].end()); // ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
* ์ด ๋ vector<int> adj[MAX] ๋์ vector<vector<int> > adj๋ก ์ ์ธํด๋ ๋จ.
(์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ ์ฌํ ์ด์ฐจ์ ๋ฒกํฐ ์ ๋๋ก ์๊ฐํ๋ฉด ๋ ๋ฏ)
*์ ๊ฒฝ์ฐ๋ C++์ผ ๋! python์ผ ๊ฒฝ์ฐ python ์์ฒด ๋ด์ ์๋ ๋ฆฌ์คํธ ๊ธฐ๋ฅ์ ์ด์ฉ, C์ธ์ด๋ ๋น์ฐํ! ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด์ผ๋ง ํจ.
*C++์ ์๋ ์ ์ฉํ STL(2)
#include<stack>
//stack : T type data๋ฅผ containํ๋ ํ์
์ ์ถ(LIFO)ํ ์๋ฃ๊ตฌ์กฐ
stack< T > name; //์ ์ธ
name.size() // name์ ๋ค์ด์๋ ์์์ ์ ๋ฐํ
name.empty() // name์ด ๋น์๋ค๋ฉด true, ์์๊ฐ ์กด์ฌํ๋ฉด false
name.top() // name์ ๊ฐ์ฅ ๋ง์ง๋ง ์์์ ์ ๊ทผ
name.push(T a) // name์ ๊ฐ์ฅ ๋ค์ a ์ถ๊ฐ
name.pop() // name์ ๊ฐ์ฅ ๋ค ์์ ์ญ์
DFS ๊ตฌํ
: NODE๋ ์ด MAX๊ฐ(0~MAX~1๋ฒ), ๊ฐ์ ์ ์ ๋ณด๋ adj๋ผ๋ vector์ adj list๋ก ์ ์ฅ๋จ
โ Recursive ๋ฐฉ์
#include<stdio.h>
visit[MAX]; //๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
void dfs(int cur){
if(visit[cur]) return; //์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ผ๋ฉด return
visit[cur]=true; //cur์ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก true๋ก ๋ฐ๊ฟ์ค
printf("%d", cur); //๋ฐฉ๋ฌธํ๋ค๊ณ print ํด์ค
for(int i=0;i<adj[cur].size();i++){ //์ง๊ธ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋๋ค์ ํ๋์ฉ ์ ๋ถ ๋์๋ณผ๊ฑฐ์
dfs(adj[cur][i]); //cur์ ์ธ์ ํ ๋
ธ๋๋ค dfs
}
}
โก STACK ๋ฐฉ์
bool visit[MAX]; stack<int> st;
void dfs(int cur){
st.push(cur);
while(!st.empty()){
int k = st.top();
st.pop();
if(visit[k]) continue;
visit[k] = true;
for(int i = 0; i<adj[k].size(); i++)
st.push(adj[k][i]);
}
}
'๐ก๐ธ๐ธ๐ถ๐ฃ: ๐๐๐๐๐๐พ๐๐ฝ๐ > ๐ก๐ฃ๐ข๐ฃ: ๐๐๐๐๐๐พ๐๐ฝ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ALPS Study] DFS(๊น์ด ์ฐ์ ํ์) - ์ ๊ธฐ๋๋ฐฐ์ถ(BOJ 1012) (0) | 2020.07.27 |
---|---|
[ALPS Study] DFS(๊น์ด ์ฐ์ ํ์) - ํ ํ๋ก์ ํธ(BOJ 9466) (0) | 2020.07.22 |
[ALPS Study] ํ์ -๊ทธ๋ํ์ DFS(๊น์ด ์ฐ์ ํ์)(1) (0) | 2020.07.16 |
[ALPS Study] ์์ ํ์ - N๊ณผ M(ํด๊ฒฐ์ค) + ๋ณต์ต (0) | 2020.07.15 |
[ALPS Study] ์์ ํ์ - ๋ธ๋์ญ2, ์ํ๊ฐ๋ ์ (0) | 2020.07.14 |