From 2cd7be79fe98d738dd8f04d1e1681593c36ad553 Mon Sep 17 00:00:00 2001 From: hyeoKing Date: Wed, 3 Aug 2022 15:24:18 +0900 Subject: [PATCH] =?UTF-8?q?FEAT:=20(3)=20=EC=9D=8C=EC=9D=B4=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20=EC=A0=95=EC=88=98=EB=93=A4=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A3=A8=EC=96=B4=EC=A7=84=20=EB=B0=B0=EC=97=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=EB=A5=BC=20=EC=A0=81=EC=A0=88=ED=9E=88=20?= =?UTF-8?q?=EB=8D=94=ED=95=98=EA=B1=B0=EB=82=98=20=EB=B9=BC=EC=84=9C=20?= =?UTF-8?q?=ED=8A=B9=EC=A0=95=20=EC=88=AB=EC=9E=90=EB=A5=BC=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20(=EC=9E=AC=EA=B7=80?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9)=20#10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...f_ways_to_target_by_doing_plus_or_minus.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 sparta_algorithm_class/week_2/homework/03_get_count_of_ways_to_target_by_doing_plus_or_minus.py diff --git a/sparta_algorithm_class/week_2/homework/03_get_count_of_ways_to_target_by_doing_plus_or_minus.py b/sparta_algorithm_class/week_2/homework/03_get_count_of_ways_to_target_by_doing_plus_or_minus.py new file mode 100644 index 0000000..88deb05 --- /dev/null +++ b/sparta_algorithm_class/week_2/homework/03_get_count_of_ways_to_target_by_doing_plus_or_minus.py @@ -0,0 +1,88 @@ +# Q. 음이 아닌 정수들로 이루어진 배열이 있다. 이 수를 적절히 더하거나 빼서 특정한 숫자를 만들려고 한다. +# 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들기 위해서는 다음 다섯 방법을 쓸 수 있다. +# -1+1+1+1+1 = 3 +# +1-1+1+1+1 = 3 +# +1+1-1+1+1 = 3 +# +1+1+1-1+1 = 3 +# +1+1+1+1-1 = 3 +# +# 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target_number이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 반환하시오. +########################################################################################################################################### + +numbers = [1, 1, 1, 1, 1] +target_number = 3 +result_count = 0 + +#TODO. step1. 모든 합을 받아줄 리스트 정의 +#TODO. step2. 모든 합을 순회하며 리스트를 채워준다. +#TODO. step3. 모든 합의 리스트들을 돌며 타겟 넘버를 채운 애들의 count를 기록해준다. +def get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index, current_sum): + #종료 조건 + if len(array) == current_index: + if current_sum == target: + global result_count + result_count += 1 + return + + get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index+1, current_sum + array[current_index]) + get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index + 1, current_sum - array[current_index]) + +print(get_count_of_ways_to_target_by_doing_plus_or_minus(numbers, target_number, 0, 0)) # 5를 반환해야 합니다! +print(result_count) + + + +######################################################################################################################## +# +# numbers = [2, 3, 1] +# target_number = 0 +# result_count = 0 # target 을 달성할 수 있는 모든 방법의 수를 담기 위한 변수 +# +# +# def get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index, current_sum): +# if current_index == len(array): # 탈출조건! +# if current_sum == target: +# global result_count +# result_count += 1 # 마지막 다다랐을 때 합계를 추가해주면 됩니다. +# return +# get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index + 1, +# current_sum + array[current_index]) +# get_count_of_ways_to_target_by_doing_plus_or_minus(array, target, current_index + 1, +# current_sum - array[current_index]) +# +# +# get_count_of_ways_to_target_by_doing_plus_or_minus(numbers, target_number, 0, 0) +# # current_index 와 current_sum 에 0, 0을 넣은 이유는 시작하는 총액이 0, 시작 인덱스도 0이니까 그렇습니다! +# print(result_count) # 2가 반환됩니다! +# + + +############################################################################################################################################### +# Case2. 설명을 위한 형태1 +# numbers = [2, 3, 1] +# target_number = 0 +# result = [] # 모든 경우의 수를 담기 위한 배열 +# +# # TODO: 재귀를 이용한 방법: +# def get_all_ways_to_by_doing_plus_or_minus(array, current_index, current_sum, all_ways): +# ''' +# 각 경우의 수의 합들을 all_ways 배열에 넘겨준다. +# :param array: 해당 함수를 호출한 곳에서 결과값 출력을 위해 넘겨준 포인터 +# :param current_index: 현재 주소, 순회와 종료 조건을 위해 필요 +# :param current_sum: 경우의 수의 합, all_ways에 append 해준다. +# :param all_ways: 경우의 수들의 합을 담아둘 배열, 별도의 리턴 없이 포인터를 이용해 호출된 함수에서 바로 사용한다. +# :return: - +# ''' +# if current_index == len(array): +# all_ways.append(current_sum) +# print(current_sum) +# return +# get_all_ways_to_by_doing_plus_or_minus(array, current_index + 1, current_sum + array[current_index], all_ways) +# get_all_ways_to_by_doing_plus_or_minus(array, current_index + 1, current_sum - array[current_index], all_ways) +# +# +# get_all_ways_to_by_doing_plus_or_minus(numbers, 0, 0, result) +# print(result) +# # current_index 와 current_sum 에 0, 0을 넣은 이유는 시작하는 총액이 0, 시작 인덱스도 0이니까 그렇습니다! +# # 모든 경우의 수가 출력됩니다! +# # [6, 4, 0, -2, 2, 0, -4, -6] \ No newline at end of file