πŸ’‘Language/C++

[c++] DFS 깊이 μš°μ„  탐색 , μž¬κ·€ν•¨μˆ˜

soonybutter 2024. 4. 2. 03:41
728x90

 

 

 DFS:  Depth - First Search (κΉŠμ΄μš°μ„ νƒμƒ‰)

  • ν˜„μž¬ μ§€μ μ—μ„œ 정해놓은 μ§€μ κΉŒμ§€ λ…Έλ“œλ₯Ό 깊게 νƒμƒ‰ν•˜λŠ” 방식
  • μŠ€νƒ λ˜λŠ” μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•œλ‹€.

 

 

 

 

μž¬κ·€ν•¨μˆ˜

  • 자기 μžμ‹ μ„ κ³„μ†ν•΄μ„œ ν˜ΈμΆœν•œλ‹€.
  1. μ΄ˆκΈ°ν™”
  2. λλ‚˜λŠ” 쑰건 (ifλ¬Έ)
  3. κ°€μ§€(branch) / μž¬κ·€μ‘°κ±΄

 

 

 

 

Q. μž¬κ·€ν•¨μˆ˜ μ˜ˆμ‹œλ¬Έμ œ

숫자 n을 μž…λ ₯ λ°›μœΌμ„Έμš”.

숫자 nλΆ€ν„° 0κΉŒμ§€ Count down ν–ˆλ‹€κ°€

λ‹€μ‹œ λŒμ•„μ˜€λŠ” 수λ₯Ό 좜λ ₯ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

ex) 4

4 3 2 1 0 1 2 3 4

ex ) 6

6 5 4 3 2 1 0 1 2 3 4 5 6

 

#include<iostream>

using namespace std;

void abc(int num)
{
	cout << num << " ";

	//μ’…λ£Œμ‘°κ±΄
	if (num == 0)
	{
		return;
	}
	//μž¬κ·€μ‘°κ±΄
	abc(num - 1);

	cout << num<< " ";
}

int main()
{
	//μ΄ˆκΈ°ν™”
	int n;
	cin >> n;

	abc(n);

	return 0;
}

 

μœ„μ˜ μž¬κ·€ν•¨μˆ˜κ°€ μ‚¬μš©λœ μ½”λ“œλ₯Ό μ˜ˆμ‹œλ‘œ μ‚΄νŽ΄λ³΄λ©΄,

 

1. main ν•¨μˆ˜μ—μ„œ μž¬κ·€ν•¨μˆ˜μ— μ΄ˆκΈ°κ°’μ„ λ„£μ–΄μ€€λ‹€.

보톡 μ–΄λŠκΉŠμ΄κΉŒμ§€ 갈 것인지 λ‚˜νƒ€λ‚΄λŠ” lev이 될 수  -> lev 

ν˜Ήμ€

처음 좜λ ₯ν•  λŒ€μƒμ„ λ„£μŒ.   -> 

 

*λ‘˜ λ‹€ λ„£λŠ” κ²½μš°λ„ μžˆλ‹€.

 

 

2. μž¬κ·€ν•¨μˆ˜ μ•ˆμœΌλ‘œ λ“€μ–΄κ°€μž.

  • μ²˜μŒμ— num이 λ“€μ–΄μ˜¨λ‹€.
  • 상단에 μžˆλŠ” cout μ‹€ν–‰ν•œλ‹€.
  • 'μž¬κ·€μ‘°κ±΄'에 ν•΄λ‹Ήλ˜λŠ” abc(num-1)으둜 κ°€μ„œ num이 0이 될 λ•ŒκΉŒμ§€ κ³„μ†ν•΄μ„œ abc()ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ²Œ λœλ‹€.
  • num==0이면 return즉 'λŒλ €μ€€λ‹€'.  
  • abc(num=0)이렀면 ν•˜λ‹¨μ˜ num-1의 num은 1μ΄μ˜€μ–΄μ•Όν•¨. μ΄λ°©μ‹μœΌλ‘œ κ³„μ†ν•΄μ„œ λ˜λŒμ•„κ°„λ‹€.
  • λ˜λŒμ•„κ°€λ©΄μ„œ ν•˜λ‹¨μ˜ cout을 μ‹€ν–‰ν•œλ‹€.

 

μž¬κ·€ν˜ΈμΆœ μœ„ ꡬ문: 호좜 μ „ μˆ˜ν–‰λ¨.
μž¬κ·€ν˜ΈμΆœ μ•„λž˜ ꡬ문: λ¦¬ν„΄ν•΄μ„œ λŒμ•„μ™”μ„ λ•Œ μˆ˜ν–‰λ¨.

 

 

 

 

μž¬κ·€ν•¨μˆ˜μ™€ μ£Όμ‚¬μœ„λ¬Έμ œ

Q.μ˜ˆμ‹œλ¬Έμ œ

μ£Όμ‚¬μœ„ 3개λ₯Ό λŒλ Έμ„ λ•Œ λͺ¨λ“  합을 좜λ ₯ν•˜μ‹œμ˜€.

(μ£Όμ‚¬μœ„: 1~6 (111,112,113,114...666)

 

#include<iostream>

using namespace std;

void dice(int lev,int sum)
{
	if (lev == 3)  //μ’…λ£Œμ‘°κ±΄
	{

		cout << sum;
		return;

	}

	//μž¬κ·€μ‘°κ±΄
	for (int i = 1; i <= 6; i++)
	{
		//ν˜„μž¬ λ ˆλ²¨μ—μ„œμ˜ sum은 각자 λ‹€ λ‹€λ₯΄λ‹€.
        //κ°€μ§€μ˜ 갯수λ₯Ό for문으둜 ν‘œν˜„ν•¨.
		dice(lev + 1, sum + i);
	}
	
}

int main()
{
	dice(0, 0); 
	
	return 0;
}
  • κ°€μ§€μ˜ 갯수λ₯Ό for 문으둜 ν‘œν˜„ν•¨.
    ex) μ£Όμ‚¬μœ„ λˆˆκΈˆμ΄ 6κ°œμ—¬μ„œ for문을 6번 λŒλ¦Ό.
  • i : κ°€μ§€, 눈금
728x90