Data miner

#BruteForce #무차별적으로_시도하기 #무차별적_대입공격

carayoon 2019. 7. 2. 17:07
728x90

특정 문제를 풀기 위해서 가능한 모든 경우의 수를 시도해보는 것이다. 만약 특정 문제를 풀기 위해서 객관식 답 5개가 주어져 있다면, 5개를 다 시도해봄으로써 문제를 풀려고 하는 방식과 동일하다.

이와 관련한 문제로는 '두 가지 리스트를 곱한 값 중 가장 큰 값을 리턴 하는' 문제가 있다.

1) 이를 푸는 과정에 있어서, 먼저 두 가지 리스트를 곱하는 모든 값들을 포함하는 새로운 리스트를 만든 다음에,

def max_product(left_cards, right_cards):
   
    
    for i in range(len(left_cards)):
        for j in range(len(right_cards)):
            num.append(left_cards[i]*right_cards[j])

 

2) 이 새로운 리스트에 담긴 값들 중에서 가장 큰 값을 리턴하는 부분을 짜면 된다. 

	num = []
    n = len(num)
    max_value = 0
    
    for k in range(1,n):
        if num[k] > max_value:
            max_value = num[k]
    return max_value

 

결과부분은 다음과 같았다. 

print(max_product([1, 6, 5], [4, 2, 3])) 
#24
print(max_product([1, -9, 3, 4], [2, 8, 3, 1]))
#32
print(max_product([-1, -7, 3], [-4, 3, 6]))
#28

 

max()함수를 이용해서 푼 코드의 내용은 다음과 같았다. 

def max_product(left_cards, right_cards):
	#max값 임의로 설정한다. 
    max_product = 0
    for left in left_cards:
       for right in right_cards:
       		max_product = max(max_product, left*right)
    
    return max_product
    

 

BruteForce의 방식은 비효율적적이라는 치명적인 문제가 있다. 모든 경우의 수를 검토한 뒤에 결정하기 때문이다. 위의 경우라면, input list의 길이가 상당히 크다면, 컴퓨터 문제가 일어나게 된다. 

다만, input이 작은 경우, 알고리즘의 과정이 매우 단순하고 명확하기 때문에 위의 방법을 써도 된다. 이 방법은 다른 알고리즘을 효율적으로 착안하는 데 있어서 기초가 되는 방법이다. "이보다 효율적인 알고리즘을 짜기 위해서는?" 이라고 질문을 던지면서 알고리즘을 짜게 되기 때문이다.