자료구조와 알고리듬 With Java/[인프런] Algorithm

Chapter 07. Recursive, Tree, Graph (DFS, BFS 기초)

계란💕 2022. 4. 15. 16:36

1. 재귀함수 (스택 프레임)

java
열기

  Note)

  - 실행 결과: 5 4 3 2 1 츨력

 

 

2. 이진수 출력 (재귀)

java
열기

  Note) 실행결과

 

 

3. 팩토리얼

java
열기

  Note) 실행 결과 : 120

  - 5! = 5 * 4 * 3 * 2 * 1의 결과인 120이 출력된다.

 

 

4. 피보나치 재귀 (메모이제이션)

java
열기

  Note) 실행 결과: 1 1 2 3 5 8 13 21 34 55

  - 배열과 for문으로 짜는 것이 재귀함수로 돌리는 것보다 성능이 좋다. (재귀를 돌리기에는 무겁다.)

    -> 재귀는 호출될 때마다 스택에 프레임이 생기기 때문이다.

  - 중소기업의 코딩테스트 질문으로 많이 나오기도 한다.

  - static int 배열을 만들어 배열에 기록해두고 출력할 수 있다.

  - 기록해두는 것을 "메모이제이션"이라고 한다.

  - 메모이제이션을 활용하면 시간 복잡도가 확 줄어든다.

 

 

 

5. 이진트리순회(DFS : Depth-First Search)

  Note) 

  - 전위 순회: 부모 -> 왼쪽 자식 -> 오른쪽 자식

  - 중위 순회: 왼쪽 자식 -> 부모 -> 오른쪽 자식

  - 후위 순회: 왼쪽 자식 -> 오른쪽 자식 -> 부모 

 

 

  (1) 전위순회

java
열기

  Note) 전위순회 실행 결과 : 1 2 4 5 3 6 7 

 

 

  (2) 중위 순회

java
열기

  Note) 중위순회 실행 결과 : 4 2 5 1 6 3 7 

 

  (3) 후위순회

java
열기

  Note) 후위순회 실행 결과 : 4 5 2 6 7 3 1 

 

 

6. 부분집합 구하기 (DFS)

java
열기

  Note) 실행 결과

 

   - 재귀함수,  back tracking, BFS  코딩 테스트에 자주 나오니 꼭 해봐야한다.

 

 

 

????

7. 이진트리 레벨탐색(BFS : Breadth-First Search)

java
열기

 

  Note) 실행 결과

  - 너비 우선 탐색 (BFS)

  - 0 레벨 : 1  ( root) / 1레벨 : 2 3 (root에서 한 번에 이동 가능) / 3레벨: 4 5 6 7 (root에서 두 번 만에 간다.)

    -> 즉, root로부터의 거리라고 볼 수 있다.

  - 다음 문제인 송아지 찾기 이해하려면 꼭 알아야한다. 

 

 

 

 

8. 송아지 찾기1(BFS - 상태 트리 탐색)

java
열기

  Note)

  - 레벨은 점프 횟수라고 볼 수 있다.

  - 최초로 발견되는 것이 최단거리

  - 중복되는 수는 없다. 

  - 3level에서 최초로 14가 발견된다.

 

 

 

9. Tree 말단 노드까지의 가장 짧은 경로 (DFS)

java
열기

  Note) 실행 결과: 1

  - 경로의 길이 : 루트 -> 말단 노드까지 가는데 이동하는 횟수, (간선의 개수)

  - 최단거리문제 -> BFS로 푼다.

    -> DFS로 풀 수는 있지만 제약이 있다. (자식 노드가 하나만 있을 때 에러가 나기 때문이다.)

 

 

 

10. Tree 말단 노드까지의 가장 짧은 경로 (BFS)

 

java
열기

  Note)  실행 결과 : 1

 

 

 

11. 그래프와 인접행렬

  - G(V, E) : G:그래프, V: vertax, E: edge

  - 인접행렬: 연결된 노드에 대해  1로 표시, 연결되있지 않으면 0으로 표시한다.

 

 

  1) 무방향 그래프

  - 방향 개념이 없다.
  - graph[a][b]와 graph[b][a] 에  모두 1 표시한다.

 

 

  2) 방향 그래프

  - 이동하는 방향이 정해져 있다.

  - 행 -> 열로 해석한다.

  - 

 

  3) 가중지 방향 그래프

  - 간선에 가중치 까지 있다. (ex) 비용) 

  - graph[a][b] = 3 : a -> b로 가는데 가중치는 3이다.

  

 

12. 경로 탐색 (DFS) - 방향그래프가 주어지면 1번 -> N번 정점으로 가는 모든 경우의 수 출력

  - 1번 노드 ->  5번까지 가는 경로

  - 12345

  - 125

  - 13425

  - 1345

  - 1425

  - 145

java
열기

   Note) 실행 결과

  - 경로에서 방문 했던 곳은 방문하지 않는다.

  - 노드 개수만큼 for문이 돈다.

  - back할 때는 체크를 하나씩 풀어준다.

 

 

13. 경로탐색 (인접리스트, ArrayList)

  - 1번 노드 ->  5번까지 가는 경로

  - 12345

  - 125

  - 13425

  - 1345

  - 1425

  - 145

 

 // 오류

5 9 
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5 

java
열기

 

 

  Note)

  - 정점의 개수가 많으면 ArrayList<>를 이용한다.

 

 

 

 

14. 그래프 최단거리(BFS) - 그래프에서 1번 정점에서 각 정점으로 가는 최소 이동 간건 수를 출력

java
열기

  Note)

  - 최단거리 = BFS문제 라고 본다.

  - dis[v]: v까지 가는 최소 거리

  - dis[nv] = dis[v] + 1 

  

  -입력

6 9

1 3 

1 4

2 1

2 5

3 4

4 5

4 6

6 2

6 5

 

  -출력 

2 : 3  

3 : 1

4 : 1

5 : 2

6 : 2

 

  -> 2 : 3 => 3   ( 1 -> 4 -> 6 -> 2)

  -> 3 : 1  => 1  (1 -> 3)

  -> 4 : 1  => 1  (1 -> 4)

  -> 5 : 1  (1 ->4 -> 5 )