티스토리 뷰

알고리즘/개념정리

완전탐색

이지홍 2022. 12. 30. 00:00
반응형

완전 탐색은 모든 경우의 수를 다 시도해 보는 것으로

상대적으로 구현이 간단하고, 해가 존재하면 항상 찾게된다. 

경우의 수에 따라 실행 시간이 비례하기 때문에 입력 값의 범위가 작은 경우 유용하다.

 

📍 단순 Brute-force

  • 단순히 반복문과 조건문으로 모든 경우를 만들어 답을 구하는 방법
  • 이 방법만을 사용하는 문제는 거의 나오지 않는다.

📍 비트마스크 (Bitmask)

  • 나올 수 있는 모든 경우의 수가 각각의 원소가 포함되거나, 포함되지 않는 두가지 선택으로 구성되는 경우 유용하게 사용
  • ex) '원소가 n개인 집합의 모든 부분 집합' 을 구한다고 할 경우, 각 원소가 포함되는지 포함되지 않는지를 0,1로 구분하여 배열에 저장해둘 수 있음

📍 재귀함수

  • 비트마스크와 마찬가지로 각 원소가 두 가지 선택지를 가질 때 유용하게 사용
  • 포함이 되면 해당 원소를 넣어 함수를 호출하고, 포함되지 않으면 그 상태에서 함수를 호출하는 방식
  • ex) 피보나치 수열, 시간복잡도 O(N)

📍 순열

  • 순열(permutation)은 서로 다른 N개의 일렬로 나열하는 방법(경우의 수)를 말함
  • 순열의 경우의 수는 N!으로 완전탐색을 이용하기 위해서는 N이 한자리 수는 되어야 함
  • 순열에 원소를 하나씩 채워가는 방식
  • 재귀함수 이용 or C++의 next_permutation() 함수 이용
  • 시간복잡도 O(N!)

📍 너비 우선 탐색(BFS), 깊이 우선 탐색(DFS)

  • 너비우선탐색(Breadth-First Search, BFS)는 하나의 요소를 방문하고 그 요소에 인접한 모든 요소를 우선 방문하는 방식
  • 깊이우선탐색(Depth-First Search, DFS)는 트리의 한 요소(노드)와 다음 수준(level)의 자식 노드를 따라가는 방향으로 탐색하는 방식
  • 길 찾기 등에 주로 쓰이는 알고리즘
    : 단순 길찾기에는 BFS/DFS만 써도 무방하지만,
    장애물이 존재하는 등 추가적 연산이 필요할 때 완전탐색 병용하기도 함.
  • ex) 지구 상에 존재하는 모든 친구 관계를 그래프로 표현하고 A와 B 사이에 존재하는 경로 찾을 때
    - DFS : 모든 친구 관계 다 살펴야한다.
    - BFS : A와 가까운 관계부터 탐색한다.


📍 너비 우선 탐색(BFS, Bread-First Search)

  • 재귀적으로 동작하지 않음
  • 그래프 탐색의 경우, 어떤 노드를 방문했었는지 여부를 반드시 검사
    (검사하지 않으면 무한루프)
  • BFS는 방문한 노드들을 차례로 저장하고 꺼낼 수 있는 큐 사용(FIFO)
  • 넓게 탐색
  • 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 이 방법을 사용.

📍 깊이 우선 탐색(DFS)

  • 재귀적으로 동작(재귀, 스택)
  • 그래프 탐색의 경우, 어떤 노드를 방문했었는지 여부를 반드시 검사
    (검사하지 않으면 무한루프)
  • 모든 노드 방문하고자 할 때 사용
  • BFS 보다 간단, BFS 비해서 검색 속도 느림
  • 모든 노드 방문하고자 할 때 사용.

반응형

'알고리즘 > 개념정리' 카테고리의 다른 글

거품 정렬(Bubble Sort)  (1) 2023.08.22
스택 & 큐  (0) 2023.02.07
백트래킹  (0) 2022.12.30
시간복잡도 - 빅 오 표기법(Big-O notation)  (0) 2022.10.12
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함