Brute Force(블루토포스)

brute force attack무차별대입 공격 가능한 모든 경우를 모두 하고 볼 일이다.직관적이고 뚜렷하다.답을 확실히 찾을 수 있다.인풋이 매우 큰 경우, 사용시의 시간 복잡도는 매우 큰 알고리즘을 생각하기 전에 불트 포스를 먼저 떠올리며 시작하는 것이 좋다.(불트 포스를 꼭 알아야 할 이유)비밀 번호 3자리를 000~999을 모두 시도하는 것과 같은 형태이다.문제에 대해서 가능한 경우를 한다(가능한 경우)가장 순수한 알고리즘이다.문제 1목록 중 최대를 요구하는 불트 포스 방식을 만들어 보라. max이것밖에 생각하지 않았다는 것은 너무도 날것으로 먹고 한 것 같다.최대를 불트 포스를 통해서 구현하는 방법에 대해서 공부하고,처음엔 그냥 return max (left_cards) * max(right_cards)를 했는데 아래와 같이 할 수 있어야 하는 두 리스트 요소의 곱 조합을 보는 것이므로 이중 for 문을 통해 구현하는 것이 적절하다.def max_product(left_cards, right_cards):입니다:#브루트포스를 이용한#리스트속최대 값을구하는 방법max_multi=0 in left_cards:right_cards:if max_multi<left*right:max_multi=left*right return max_multi#테스트 print(max_product([1, 6, 5],[4, 2, 3]))print(max_product([1, 8, 3, 1]))print([-7 ,[4-6])모든 경우의 수를 본다는 것이 비효율적입니다.인풋이 커질수록 시간의 복잡성은 급격히 커진다는 것입니다.문제 2예컨대 A B C D상태에서 2개의 짝을 만들면서 불트 포스, 모든 탐색하기 때문에 이중 for문을 이용해야 한다.인덱스는 01 2 3에서 가장 위의 for문은 0~3에서->range(len(list)+1)이며, 그 아래 for문은 1~2로->range(i+1, len(list)이다. b정도 for문은 가장 형식적이면서도 많은 사용되므로 암기하다.#제곱근 사용을허브로 만들기 위한 sqrt함수 from math import sqrt#두 매장의직선 거리를계산해 주는함수 def distance(store1, store2):return sqrt((store1[0]-store2[0])**2+(store1[1]-store2[1])**2)#가장가까운 두매장을 찾아주는함수 def close_pair(coordinates):max_distance=0 pair=[coordinates]for j in range(len(len(test_coordin)-1, test_nate), coardes,len(test_coordinates):store1, store2=좌표[j], 좌표[i]dis=distance(store1, pair[1])>dis:pair=[store1, store2]return pair#테스트#튜플리스트로 매장들의좌표 위치를받아옴. test_coordinates=[(2, 3)],(12, 30)(40, 50)(5(12,10),(3(3,3,3)3)4)]print(closest_pair(test_coordinates)을 클릭합니다함수 부분이 가장 중요합니다, 쌍의 초기화 부분은 인덱스 0.1로 구성되어 있습니다. 쌍 조합과 초기화 쌍과 비교하여 조건을 충족하면 쌍을 갱신해 주시면 됩니다.def closest_pair(coordinates):max_distance=0 pair=[coordinates[0], cordinates[1]for j in range(len(test_coordinates)-1):range(j+1, len(test_coordinates):store1, store2=cordinates[j], cordinates[i]dis=distance(pair[0], pair[1])>dis:dis dis dis distore1, store1, distore, store2]리턴 페어입니다def closest_pair(coordinates): max_distance = 0 pair = [coordinates[0], cordinates[1] for j in range(len(test_coordinates)-1): range(j+1, len(test_coordinates): store1, store2 = cordinates[j], cordinates[i] dis = distance(pair[0], pair[1]) > dis: dis dis distore1, store1, distore, store2] 리턴 페어입니다문제 3입니다먼저 생각한 것은 건물 1빌딩 2이 존재할지 안 할지를 생각했다, 그리고 빌딩의 염기 배열 가운데 두개의 쌍을 보고(불트 포스)가능한 경우에 따랐다 물의 양을 갱신하도록 만들려 했다.처음의 코드는 다음과 같다.문제를 살펴볼까.도중에 점검 지점을 프린트하도록 구성하고 출력하고 보니.빌딩 1이 없을 때 부분에서 에러가 발생했다.아마 조건 간의 행위의 중복이 발생한 것 같다, 빌딩 1이 존재->빌딩 2가 존재하지 않는 빌딩 1이 존재하지 않는->빌딩 2이 존재하는 것과 관련해서 문제가 발생, 이외에도 간과한 조건이 많이..한- 없다-어느(좀 작은)그럼 물의 양을 뽑아 줘야 한다.여러가지 길을 틀린 구성이라 생각된다.이런 과정을 거치면 범위를 정하고 그 범위 내의 블록을 제거하는 형태로 컴퓨터에게 시킨다?상태를 생각하며 앞으로 코드를 작성해야 한다는 생각이 들기도 한다.알고리즘의 유형을 익히고 그 유형에 입각해서 보도록 하자.( 다를지도 모르지만 개인적인 공부 방향에 대한 고민?)def trapping_rain(buildings):water=0 blank_temp=0fori inrange(len(buildings)-1):building1, building2=buildings[i+1]#앞으로 4가지 사례에 대한 각각의 물의 양을 경신하며#일반적인 경우를 먼저 써야 더 효율적이며, ifbuilding1=0:1빌딩 building2, bi!=0:water+=abs(building1-building2)print(water)else:water+=building1 print(water)else:#빌딩 1이 존재하지않음, if building2==0:blank_temp+=1else:water+=min(building1, building2)*blank_temp print(water)blank_temp=0#초기화 return water다른 답안 코드는 조금 다른 생각을 했다.왼쪽 최대~오른쪽 최대의 사이에 꼭 물이 수 있다.그 물통 속에 작은 블록이 차지하는 위치를 뽑아 준다.전술의 문제 2에서 본 2개의 대 범위를 모두 탐색하는 형태인 듯하다.기준이 갱신되어, 기준의 왼쪽, 오른쪽에 최대치를 갖고( 편뜨기)왼쪽, 오른쪽 가운데 최소 높이를 upper_bound값을 가지고 총 높이에 대해서 갱신된다.