Algorithm/BFS & DFS

[Algorithm] DFS 와 μž¬κ·€ ν•¨μˆ˜( Recursive Function )

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2023. 10. 31.

πŸ’«μž¬κ·€ν•¨μˆ˜

 

λ‚΄λΆ€μ μœΌλ‘œ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€ν•¨μˆ˜λΌκ³  ν•œλ‹€.

λ°˜λ“œμ‹œ μ’…λ£Œ 쑰건이 ν•„μš”ν•˜λ‹€λŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€. μž¬κ·€ 호좜(μžμ‹ μ„ 호좜)을 λ„ˆλ¬΄ 많이 ν•˜κ²Œ 되면 μŠ€νƒ λ©”λͺ¨λ¦¬ μ˜μ—­μ— λ„ˆλ¬΄ λ§Žμ€ 곡간을 ν• λ‹Ήν•˜κ²Œ λ˜μ–΄ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” 점을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ μž¬κ·€ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” μ΅œμ•…μ˜ 경우 μ–Όλ§ˆλ‚˜ λ§Žμ€ μž¬κ·€ 호좜이 λ°œμƒν•˜λŠ” μ§€ 잘 μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•œλ‹€. λ˜ν•œ μž¬κ·€ ν•¨μˆ˜μ— λŒ€ν•œ 이해도가 λ†’μœΌλ©΄ μ½”λ“œμ˜ 가독성이 μ’‹μ•„μ§ˆ 수 μžˆμœΌλ‚˜, κ°œλ…μ„ λͺ¨λ₯΄λŠ” μ‚¬λžŒμ΄ 보면 μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 단점이 μžˆλ‹€.

 

 

얼핏보면 같은 두 μ½”λ“œκ°€ μžˆλ‹€. 두 μ½”λ“œμ˜ 차이점이 λ¬΄μ—‡μΌκΉŒ?

 

Case 1

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public void DFS(int n){
        if(n == 0return;
        else{
            System.out.print(n + " ");
            DFS(n-1);
        }
    }
    public static void main(String[] args){
        Solution T = new Solution();
        T.DFS(5);
    }
}
cs

 

Case 2

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public void DFS(int n){
        if(n == 0return;
        else {
            DFS(n-1);
            System.out.print(n + " ");
        }
    }
    public static void main(String[] args){
        Solution T = new Solution();
        T.DFS(5);
    }
}
cs

 

두 μ½”λ“œλŠ” μ—„μ²­ 큰 차이점을 κ°–κ³  μžˆλ‹€.

μΌ€μ΄μŠ€ 1 번의 경우 5 4 3 2 1 이 좜λ ₯ λ˜μ§€λ§Œ, μΌ€μ΄μŠ€ 2번의 경우 1 2 3 4 5 κ°€ 좜λ ₯λœλ‹€.

이런 차이점을 λ§Œλ“œλŠ” μ΄μœ κ°€ λ°”λ‘œ μž¬κ·€ ν•¨μˆ˜μ˜ νŠΉμ§•μ— μžˆλ‹€.

Runtime Data Area μ—μ„œ μŠ€νƒ ν”„λ ˆμž„μ—λŠ”  μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, 볡귀 μ£Όμ†Œ κ°€ λ‹΄μ•„μ Έ 컨트둀 λœλ‹€.

 

1️⃣Case 1

μΌ€μ΄μŠ€ 1을 보자.

λ§€κ°œλ³€μˆ˜μ— 5λ₯Ό λ„£μ–΄μ„œ DFS() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ˜€λ‹€.  λ§€κ°œλ³€μˆ˜λŠ” 0 이 μ•„λ‹ˆλ―€λ‘œ 4번 행이 μ‹€ν–‰λœλ‹€. 5번 행이 μ‹€ν–‰λ˜μ–΄ 5κ°€ 좜λ ₯되고, 자기 μžμ‹ μΈ DFS() ν•¨μˆ˜(λ§€κ°œλ³€μˆ˜ : 4)λ₯Ό ν˜ΈμΆœν•˜κ³  κΈ°μ‘΄ DFS(5)λŠ” λ§€κ°œλ³€μˆ˜μ™€ 볡귀 μ£Όμ†Œλ₯Ό κ°–κ³  μŠ€νƒμ— PUSH λ˜μ–΄ sleep μƒνƒœκ°€ λœλ‹€. 이 과정이 λ°˜λ³΅λœλ‹€.

λ§€κ°œλ³€μˆ˜κ°€ 0이 λ˜μ–΄ 3번 행이 μ‹€ν–‰λ˜μ–΄ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜κ²Œ λœλ‹€. 그러면 μŠ€νƒμ— μŒ“μ—¬μžˆλ˜ ν•¨μˆ˜λ₯Ό POPν•΄μ„œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€. κ°€μž₯ λ§¨μœ„μ— μžˆλŠ” DFS(1) 이 POPλœλ‹€. DFS(1) 은 7라인뢀터 μ‹€ν–‰λ˜λ©°, 8라인이 μ‹€ν–‰λ˜κ³  λ‚œλ’€μ—λŠ” ν•¨μˆ˜κ°€ μ’…λ£Œ λ˜λ©΄μ„œ μŠ€νƒμ—μ„œ μž λ“€μ–΄ 있던 DFS(2) λ₯Ό POP ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. 이 과정이 λ°˜λ³΅λœλ‹€.

그림으둜 λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

2️⃣Case 2

μΌ€μ΄μŠ€ 2번의 경우λ₯Ό 보자.

λ§€κ°œλ³€μˆ˜μ— 5λ₯Ό λ„£μ–΄μ„œ DFS() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ˜€λ‹€.  λ§€κ°œλ³€μˆ˜λŠ” 0 이 μ•„λ‹ˆλ―€λ‘œ 4번 행이 μ‹€ν–‰λœλ‹€. κ·Έ λ‹€μŒ λ°”λ‘œ 자기 μžμ‹ μΈ DFS() ν•¨μˆ˜(λ§€κ°œλ³€μˆ˜ : 4)λ₯Ό ν˜ΈμΆœν•˜κ³  κΈ°μ‘΄ DFS(5)λŠ” λ§€κ°œλ³€μˆ˜μ™€ 볡귀 μ£Όμ†Œλ₯Ό κ°–κ³  μŠ€νƒμ— PUSH λ˜μ–΄ sleep μƒνƒœκ°€ λœλ‹€. 이 과정이 λ°˜λ³΅λœλ‹€.

λ§€κ°œλ³€μˆ˜κ°€ 0이 λ˜μ–΄ 3번 행이 μ‹€ν–‰λ˜μ–΄ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜κ²Œ λœλ‹€. 그러면 μŠ€νƒμ— μŒ“μ—¬μžˆλ˜ ν•¨μˆ˜λ₯Ό POPν•΄μ„œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€. κ°€μž₯ λ§¨μœ„μ— μžˆλŠ” DFS(1) 이 POPλœλ‹€. DFS(1) 은 6라인뢀터 μ‹€ν–‰λ˜λ©° μ΄λ•Œ 맀개 λ³€μˆ˜μΈ n이 1μ΄λ―€λ‘œ 1λ₯Ό 좜λ ₯ν•œλ‹€. 그리고 7, 8라인이 μ‹€ν–‰λ˜κ³  λ‚œλ’€μ—λŠ” ν•¨μˆ˜κ°€ μ’…λ£Œ λ˜λ©΄μ„œ μŠ€νƒμ—μ„œ μž λ“€μ–΄ 있던 DFS(2) λ₯Ό POP ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. DFS(2) 도 λ˜‘κ°™μ΄ 6λΌμΈμ—μ„œ 2λ₯Ό 좜λ ₯ν•˜κ²Œ 되고, 8라인 κΉŒμ§€ ν•¨μˆ˜κ°€ μ’…λ£Œλœ λ’€ μŠ€νƒμ˜ μ΅œμƒλ‹¨ ν•¨μˆ˜λ₯Ό POP ν•œλ‹€. 이 과정이 λ°˜λ³΅λœλ‹€.

그림으둜 λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

πŸ“‹μž¬κ·€ ν•¨μˆ˜μ˜ λŒ€ν‘œμ μΈ 예

μž¬κ·€ν•¨μˆ˜μ˜ λŒ€ν‘œμ μΈ λ¬Έμ œλ‘œλŠ” ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄, νŒ©ν† λ¦¬μ–Ό , μˆœμ—΄κ³Ό μ‘°ν•©, 그리고 DFS λ¬Έμ œλ“€μ΄ μžˆλ‹€.

 

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - ν”Όλ³΄λ‚˜μΉ˜ 수

https://school.programmers.co.kr/learn/courses/30/lessons/12945

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

DFS

Flood fill을 μ΄μš©ν•˜μ—¬ ν’€κΈ°

https://school.programmers.co.kr/learn/courses/30/lessons/154540

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

 

λŒ“κΈ€