- brute-force는 문제를 해결하기 위한 간단하고 쉬운 접근법
- Just-do-it
force
의 의미는 사람(지능)보다는 컴퓨터의 force를 의미
- brute-force 방법은 대부분의 문제에 적용 가능
- 상대적으로 빠른 시간에 문제 해결(알고리즘 설계)을 할 수 있음
- 문제에 포함된 자료(요소, instance)의 크기가 작다면 유용
- 학술적 또는 교육적 목적을 위해 알고리즘의 효율성을 판단하기 위한 척도로 사용됨
: 자료들의 list에서 key값을 찾기 위해 첫 번째 자료부터 비교하면서 진행
- 결과
- 탐색 성공
- 탐색 실패
- 모든 경우의 수를 생성하고 테스트하기 때문에 수행 속도는 느리지만, 해답을 찾아내지 못할 확률이 작음
- 완전 검색은 입력의 크기를 작게 해서 간편하고 빠르게 답을 구하는 프로그램을 작성함
- 이를 기반으로
그리디 기법
이나동적 계획법
을 이용해서 효율적인 알고리즘을 찾을 수 있음 - 코딩테스트 등에서 문제를 풀 때, 우선 완점 검색으로 접근하여 해답을 도출한 후, 성능 개선을 위해 다른 알고리즘을 사용하고 해답을 확인하는 것이 바람직함
- 0~9 사이의 숫자 카드에서 임의의 카드 6장을 뽑았을 때, 3장의 카드가 연속적인 번호를 갖는 경우를 run이라 하고, 3장의 카드가 동일한 번호를 갖는 경우를 triplet이라고 한다.
- 그리고, 6장의 카드가 run과 triplet으로만 구성된 경우를 baby-gin 으로 부른다
- 6자리의 숫자를 입력 받아 baby-gin 여부를 판단하는 프로그램을 작성하라.
- 고려할 수 있는 모든 경우의 수 생성하기
- 6개의 숫자로 만들 수 있는 모든 숫자 나열 (중복 포함)
- 해답 테스트 하기
- 앞의 3자리와 뒤의 3자리를 잘라, run과 triplet 여부를 테스트하고 최종적으로 baby-gin 판단
- 많은 종류의 문제들이 특정 조건을 만족하는 경우나 요소를 찾는 것
- 전형적으로
순열(permutation)
,조합(combination)
, 그리고부분 집합(subsets)
과 같은 조합적 문제들 (Combinatorial Problems) 과 연관됨 - 완전 검색은 조합적 문제에 대한 brute-force 방법이다
- 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것
- 서로 다른 n개 중 r개를 택하는 순열은 nPr
- 다음과 같은 식이 성립함
- nPr = n x (n-1) x (n-2) x ... x (n-r+1)
- nPn = n! 이라고 표기하며,
Factorial
이라 부름- n! = n x (n-1) x (n-2) x ... 2x1
- 순열은 순서화된 요소들의 집합에서 최선의 방법을 찾는 것과 관련 있음
- ex) TSP (Traveling Salesman Problem)
- N 개의 요소들에 대해서 n!개의 순열들이 존재
- n >12 인 경우, 시간 복잡도 폭발!!! (지수승으로 올라가기 때문에...)
def perm(n,k):
if k == n:
#do something
else:
for i in range(k, n):
swap(k,i)#swap!
perm(n, k+1)
swap(k,i) #다시 원상 복귀
- 집합에 포함된 원소들을 선택하는 것
- 다수의 중요 알고리즘들이 원소들의 그룹에서 최적의 부분 집합을 찾는 것임
- ex) 배낭 짐싸기 (knapsack)
- N개의 원소를 포함한 집합
- 자기 자신과 공집합 포함한 모든 멱 집합(power set)의 개수는 2^n개
- 원소의 수가 증가하면 부분집합의 개수는 지수적으로 증가
- 4개 원소를 포함한 집합에 대한
power set
구하기
- 원소 수에 해당하는 N개의 비트열을 이용
- n번째 비트값이 1이면 n번째 원소가 포함되었음을 의미
서로 다른 n개의 원소 중 r개를 순서 없이 골라낸 것
- 조합의 수식
- nCr =
n-1 C r-1
+n-1 C r
- nC0 = 1
- nCr =