① list_1과 list_2 를 동시에 접근하여 구성 내용이 일치하는지 확인하는 방법
② 이분 탐색을 이용하는 방법(막연하게 가능할 것 같다는 생각이 든다)
1) list_1에서 첫 번째를 선택한다. (for)
2) (for) list_2에서 첫 번째를 선택한다. (for)
3) (for, for) list_1 선택된 것과 list_2 선택된 것이 같으면 (if)
4) (for, for, if) 따로 담아두기
5) 따로 담아둔 list와 list_2가 동일하면(if)
6) (if) true 반환하기
7) 그렇지 않으면(else:)
8) false 반환하기
list_1 = ["만", "떡", "오", "사", "콜"]
list_2 = ["오", "콜", "떡"]
def is_available_to_order(menus, orders):
same_compo = []
for a_menus in menus: # 1) list_1에서 첫 번째를 선택한다. (for)
for a_orders in orders: # 2) (for) list_2에서 첫 번째를 선택한다. (for)
if a_menus == a_orders: # 3) (for, for) list_1 선택된 것과 list_2 선택된 것이 같으면 (if)
same_compo.append(a_orders) # 4) (for, for, if) 따로 담아두기
if len(orders) == len(possible_menu): # 5) 따로 담아둔 list와 list_2가 동일하면(if)
return True # 6) (if) true 반환하기
else: # 7) 그렇지 않으면(else:)
return False # 8) false 반환하기
result = is_available_to_order(list_1, list_2)
print(result)
① 결과: O(N^2) (= O(log2))
② 이유: for 문이 겹쳐서 2번 사용됨
③ 문제: 어느 list의 배열이 커지더라도 비교 횟수가 기하급수로 증가함
④ 해결: 이분 탐색을 사용하면 가능할 것 같다. 감은 있지만 코드로 구현하기 위해서는 조금 더 연구가 필요하다.
① + = 1로, - = -1로 변환해 풀 수 있는 방법은 없을까? (구체적인 방법이 떠오르지 않는다.)
② 나타나는 숫자 사이 어떤 관계가 있지 않을까? 있다. 찾았다.
1) 팩토리얼을 사용하는 함수를 만든다.
2) 1을 모두 합한다.
3) 나머지를 구한다.
4) 분자에 factorial(총합)의 결과를 할당한다.
5) 분모에 factorial(나머지) * factorial(목표하는 수) 결과를 할당한다.
6) 계산한다.
7) 결과를 반환한다.
numbers = [1, 1, 1, 1, 1]
target_number = 3
def factorial(number): # 1) 팩토리얼 생성하는 함수를 만든다.
if number == 1: # 1-1) 인자가 1이면 1을 반환하고 함수를 빠져나온다.
return 1
return number * factorial(number - 1) # 1-2) 그렇지 않으면 인자와 (인자-1)을 인자로 하는 함수의 결과를 도출한다.
def get_count_of_ways_to_target_by_doing_plus_or_minus(array, target):
sum_array = sum(array) # 2) 1을 모두 합한다.
rest_number = sum_array - target # 3) 나머지를 구한다.
numerator = factorial(sum_array) # 4) 분자에 factorial(총합)의 결과를 할당한다.
denominator = factorial(rest_number) # 5) factorial(target) # 분모에 factorial(나머지) * factorial(목표하는 수) 결과를 할당한다.
result = int(numerator / denominator) # 6) 계산하고 정수로 변환한다.
return result # 7) 결과를 도출한다.
print(get_count_of_ways_to_target_by_doing_plus_or_minus(numbers, target_number))
① 결과: O(N)
② 이유: 1이 N개 있다면 최대 N번 각 자리를 접근할 것이다.