개발일기 21.06.11 파이썬

Nhahan·2021년 6월 11일
0

항해99 개발일기

목록 보기
19/31
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]))

0개의 댓글