[Algorithm] 브루트 포스와 BFS, DFS

2020. 11. 26. 20:25·Computer Science/Algorithm
728x90

브루트 포스(Brute Force) 란?


Brute(무식한) + Force(힘)

 

브루트 포스는 완전 탐색 알고리즘으로,

가능한 모든 경우의 수를 탐색하고 조건에 충족되는 결과만을 가져온다.

 

무식하게 모두 탐색하기 때문에 100%의 확률로 정답을 출력합니다.

알고리즘은 기본적으로 해가 존재할 것으로 예상되는 범위를 탐색하기 때문에,

브루트 포스 알고리즘을 설계할 때, '해가 하나 이상 존재한다'는 가정을 세우고 모든 범위를 탐색합니다.

 

100% 정답률을 가지며 만들기 쉽다는 장점이 있지만,

실행 시간이 오래 걸린다는 단점이 있습니다.

 

 

 

 

 

 

 

구조에 따른 브루트 포스의 종류


브루트 포스는 모든 자료를 탐색해야하기 때문에

어떤 구조더라도 전체를 탐색할 수 있는 방법을 가진다.

 

선형 구조를 전체 탐색하는 방법은 순차 탐색이 있고,

비선형 구조를 전체 탐색하는 방법은 BFS(넓이 우선 탐색), DFS(깊이 우선 탐색)가 있다.

 

 

 

 

 

 

 

순차 탐색


순차 탐색의 방법은 간단합니다.

 

① 주어진 문제를 구조화한다.

② 구조화된 공간을 적절한 방법으로 해를 찾을 때까지 탐색한다.

 

 

 

 

 

 

 

너비 우선 탐색 ( BFS, Breadth-Fist Search )


- 탐색 트리의 루트노드부터 목표노드까지 단계별로 횡방향으로 탐색하는 방식

- 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 선택한다.

 

- 시작 노드에서부터 거리에 따라 단계별로 탐색하며, 재귀적으로 동작하지 않는다.

- 그래프 탐색 시 어떤 노드를 방문했었는지 여부를 검사해야 한다는 것이다. 이를 검사하지 않을 경우 무한루프에 빠질 수 있다.

 

- 구현방법

  1. 큐(Queue) 를 이용 : 선입선출(FIFO) 원칙으로 방문한 노드들을 차례로 큐에 저장한 후 꺼낸다.

 

- 장점

  • 출발노드에서 목표노트까지 최단 길이 경로를 보장한다.

 

- 단점

  • 경로가 매우 길 경우 탐색 가지의 증가에 따라 비교적 많은 기억 공간을 필요로 한다.

  • 유한(finite) 그래프의 경우, 해가 존재하지 않는다면 모든 그래프를 탐색하고 실패로 끝난다.

  • 무한(infinite) 그래프의 경우, 결코 해를 찾지도, 끝내지도 못한다.

  • DFS에 비해 복잡하다.

 

 

 

 

 

 

 

깊이 우선 탐색 ( DFS, Depth-First Search )


- 루트 노드(혹은 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법

- 모든 노드를 방문하고자 하는 경우에 선택한다.

 

- 자기 자신을 호출하는 순환 알고리즘의 형태를 가지고 있다.

- 그래프 탐색 시 어떤 노드를 방문했었는지 여부를 검사해야 한다는 것이다. 이를 검사하지 않을 경우 무한루프에 빠질 수 있다.

 

- 구현 방법

  1. 순환 호출 이용

  2. 명시적인 스택(Stack) 사용 : 방문한 정점들을 명시적 스택에 저장하였다가 다시 꺼내어 작업한다.

 

- 장점

  • 현 경로상의 노드들만 기억하면 되기 때문에 저장공간의 수요가 비교적 적다.

  • 목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.

 

- 단점

  • 해가 없는 경로 속에 깊이 빠질 수 있다. 따라서 실제 경우에는 미리 정한 임의의 깊이까지 탐색하고 다음의 경로를 탐색하는 방법이 유용할 것이다.

  • 얻어진 해가 최단 경로라는 보장이 없다. 해에 다다르면 탐색을 끝내므로, 목표에 이르는 경로가 다수인 문제에 대해 깊이 우선 탐색은 얻어진 해가 최적이 아닐 수 있다.

  • BFS에 비해 좀 더 간단하지만 느리다.

 

 

 

 

 

 

 

References

https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89
https://ko.wikipedia.org/wiki/%EB%84%88%EB%B9%84_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89
728x90
저작자표시 (새창열림)

'Computer Science > Algorithm' 카테고리의 다른 글

[Algorithm] 자료구조 - 연결 리스트 (Linked list)  (0) 2021.03.25
[Algorithm] 자료구조 - 배열(Array)  (0) 2021.03.25
[Algorithm] 자료구조(Data Structure) 란?  (0) 2021.03.25
[Algorithm] 빅오 표기법과 시간 복잡도의 개념 및 예제  (2) 2021.03.24
[Algorithm] 소수를 찾는 방법, 에라토스테네스의 체  (0) 2021.01.17
'Computer Science/Algorithm' 카테고리의 다른 글
  • [Algorithm] 자료구조 - 배열(Array)
  • [Algorithm] 자료구조(Data Structure) 란?
  • [Algorithm] 빅오 표기법과 시간 복잡도의 개념 및 예제
  • [Algorithm] 소수를 찾는 방법, 에라토스테네스의 체
s_ih_yun
s_ih_yun
  • s_ih_yun
    CODESYUN
    s_ih_yun
  • 전체
    오늘
    어제
    • 분류 전체보기 (339)
      • Web (8)
      • Java (7)
      • Spring (19)
      • Git (16)
      • MyBatis (1)
      • HTML & CSS (14)
      • JavaScript (11)
      • DevOps (4)
      • Cloud (8)
      • Lanuage (13)
        • C++ (3)
        • Python (10)
      • DB (1)
        • MySQL (1)
        • Oracle (2)
      • Computer Science (26)
        • Concept (3)
        • Algorithm (23)
      • Baekjoon (104)
        • 단계별로 풀어보기 (78)
      • CodeUp (98)
        • Python 기초 100제 (98)
      • Programmers (2)
      • Books (3)
      • etc (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Syun's Pages
  • 인기 글

  • 태그

    myBatis
    java
    C
    clean code
    HTML
    SourceTree
    알고리즘
    BOJ
    aws
    oracle
    Python
    web
    VS Code
    단계별로 풀어보기
    Cloud
    spring
    CodeUp 기초 100제
    자료구조
    git
    CSS
    c++
    codeup
    MySQL
    Programmers
    db
    JavaScript
    Tistory
    github
    웹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_ih_yun
[Algorithm] 브루트 포스와 BFS, DFS
상단으로

티스토리툴바