๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐“ก๐“ธ๐“ธ๐“ถ๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚/๐“ก๐Ÿฃ๐Ÿข๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚

[ALPS Study] ํƒ์ƒ‰ -๊ทธ๋ž˜ํ”„์™€ DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)(2)

*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]);
    }
}