import random
numbers = [1, 1, 1, 1, 1]
target_number = 3
def get_count_of_ways_to_target_by_doing_plus_or_minus(array, target):
pm = [1, -1]
cases = []
while 1:
ran_num = []
for arr in array:
ran_num.append(arr * random.choice(pm))
cases.append(ran_num)
cases = list(set([tuple(case) for case in cases]))
if len(cases) == (2 ** len(array)):
break
answer = []
for case in cases:
answer.append(sum(case))
return answer.count(target)
print(get_count_of_ways_to_target_by_doing_plus_or_minus(numbers, target_number)) # 5를 반환해야 합니다!
문제명 :더하거나 빼거나
풀이가 맞는건지 모르겠지만 예외 없이 다 잘된다
이 풀이에서의 문제점은 numbers 리스트의 숫자들을 음수, 양수로 만들어 더해주는 모든 경우의 수를 커버하는 식을 어떻게 쓸 지 도무지 모르겠단 점이었다
그래서 부호 판정식을 랜덤으로 주고, while로 모든 경우의 수가 나올 때까지 돌리는 식을 썼다
원랜 재귀함수 문제인데 재귀함수로 이걸 구현하니까 numbers의 len이 3이하일 땐 잘 돌아갔는데, len이 5인 리스트로 돌리니까 Recursion error가 발생했다... 그만큼 이 식이 비효율적이라는 말도 되긴 하는 것 같다
어쨌든 풀었으니까...
set으로 2차원 배열의 중복을 바로 제거하는건 불가능해서 tuple로 만들어주고 set으로 중복을 제거 뒤 다시 list로 만들어주어야하는게 특이한 점이다
cases = list(set([tuple(case) for case in cases]))