• 그래프 탐색 알고리즘 DFS/BFS 정의 개요 사용방법

    2021. 12. 16.

    by. KAEY

    이것이 코딩테스트다. 나동빈 신님의 강의를 바탕으로 작성하였습니다.


    그래프 탐색 알고리즘 : DFS/BFS

    탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
    대표적인 그래프 탐색 알고리즘으로 DFS와 BFS가 있다.
    DFS/BFS는 코테에서 자주 등장하는 유형으로 반드시 숙지해야 한다.

     



    알고 있어야 하는 개념. 다양하게 쓰인다.


    >> (1) 스택 자료구조
    먼저 들어 온 데이터가 나중에 나가는 형식(선입후출) 자료구조이다.
    입구와 출가가 동일한 형태로 스택을 시각화할 수 있다.
    밑이 막혀있는 프링글스과자 원통형 케이스를 생각하면 좋다.



    print(stack[::-1]) 을 하면 스택의 최상단부터 출력
    print(stack) 을 하면 최하단부터 출력(가장 먼저 삽입한 원소)
    파이썬에서 리스트에 원소 추가는 append / C++에서는 push 

     

     

     

    >> (2) 자료구조
     먼저 들어 온 데이터가 먼저 나가는 형식(선입선출)의 자료구조이다.
     큐는 입구와 출구가 모두 뚫린 터널과 같은 형태로 시각화할 수 있다.



     파이썬에서는 큐를 사용할 때, deque 라이브러리를 사용한다. (리스트보다 시간 복잡도가 낮아짐)
     파이썬에서의 큐 삭제는 popleft() 가 관행적임. 오른쪽들어와서 왼쪽으로 나간다.
     queue.reverse() 를 사용하면 큐를 역순으로 바꾸는게 가능하다.
     c++은 pop으로 삭제, 먼저 들어온 원소 호출은 q.front() 를 사용한다. 

     

     


    재귀함수

    재귀함수란 자기 자신을 다시 호출하는 함수를 의미한다.
     단순한 형태의 재귀 함수 예제.
     '재귀 함수를 호출합니다' 라는 문자열을 무한히 출력한다.
     (파이썬)어느정도 출력하다가 최대 재귀 깊이 초과 메시지가 출력된다.

     

     

     def recursive_function():
    	print('재귀 함수 호출.')
    	recursive_function()
    
     recursive_function()

     

     

    문제 풀이에서 사용할 시엔, 종료 조건을 반드시 명시해야 한다.
     종료 조건을 제대로 명시하지 않으면 무한히 호출될 수 있다.

     def recursive_function(i):
    	if i == 100: #100번 호출 시 종료
    		return
    	print('재귀 함수 호출.')
    	print(i, '번째 재귀함수에서', i+ 1, '번째 재귀함수 호출.')
    	recursive_function(i+1)
    	print(i, '번째 재귀함수를 종료합니다.) #99에서 1로 내려간다. (스택)
    
     recursive_function(1)

     

     

    > 팩토리얼 구현 예제. 
    > 유클리드 호제법

     


    재귀 함수 사용의 유의 사항.

     재귀 함수를 잘 사용하면 복잡한 알고리즘을 간결하게 작성할 수 있다.
     단, 오히려 다른 사람이 이해하기 어려운 형태의 코드가 될 수 있으므로 신중해야 한다.
     모든 재귀 함수는 반복문을 이용하여 동일한 기능을 구현할 수 있음.

     


     재귀 함수가 반복문보다 유리한 경우도, 불리한 경우도 있다.
     컴퓨터가 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓인다.
     그래서 스택을 사용해야 할 때, 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많다.

     

     


     DFS는 깊이 우선 탐색이라고도 부르며, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘.
     DFS는 스택 자료구조(혹은 재귀함수)를 이용하고, 구체적인 동작 과정은 다음과 같다.


     1. 탐색 시작 노드를 스택에 삽입하며 방문 처리 한다.
     2. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면, 그 노드를 스택에 넣고
     방문처리 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
     3. 2번을 수행하지 못할 때 까지 반복한다.

     

     
     BFS 는 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.
     큐 자료구조를 이용하고, 구체적인 동작 과정은 다음과 같다.


     1.  탐색 시작 노드를 큐에 삽입하고, 방문 처리를 한다.
     2.  큐에서 노드를 꺼낸 후에, 해당 노드의 인접 노드 중 방문하지 않은 노드를 모든 큐에 삽입하고, 방문처리한다.
     3. 2를 수행하지 못할 때까지 반복한다.

     


    < 예제 >
     1. 음료수 얼려먹기
     2. 미로 탈출

    댓글 (비로그인 댓글 허용하지 않습니다.)