From 6269b9b896eefe51acfa860e87a111f40430cdeb Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sun, 24 Apr 2022 05:37:10 +0900 Subject: [PATCH] memoization and early termination Verifying solution... Test 1 passed! Test 2 passed! Test 3 failed [Hidden] Test 4 passed! [Hidden] Test 5 failed [Hidden] --- extra/distract-the-trainers/solution.py | 36 ++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/extra/distract-the-trainers/solution.py b/extra/distract-the-trainers/solution.py index 0d12d81..356cf68 100644 --- a/extra/distract-the-trainers/solution.py +++ b/extra/distract-the-trainers/solution.py @@ -1,12 +1,15 @@ def solution(banana_list): fewest_possible_number = len(banana_list) + memo = {} for pairs in generate_trainer_pairs(list(range(len(banana_list)))): possible_number = len(banana_list) for i, j in pairs: - if check_loop(banana_list[i], banana_list[j]): + if check_loop(banana_list[i], banana_list[j], memo): possible_number -= 2 if possible_number < fewest_possible_number: fewest_possible_number = possible_number + if fewest_possible_number < 2: # early termination + break return fewest_possible_number import copy @@ -15,28 +18,25 @@ def generate_trainer_pairs(trainer_id_list): yield [] else: first_id = trainer_id_list[0] - temp_list = copy.deepcopy(trainer_id_list) - temp_list.remove(first_id) - for second_id in temp_list: - tt_list = copy.deepcopy(temp_list) - tt_list.remove(second_id) - for pairs in generate_trainer_pairs(tt_list): + for second_id in trainer_id_list[1:]: + reduced_list = copy.deepcopy(trainer_id_list) + seduced_list.remove(first_id) + reduced_list.remove(second_id) + for pairs in generate_trainer_pairs(reduced_list): yield [(first_id, second_id)] + pairs -def check_loop(x, y): - if (x + y) % 2 == 1: # sum is odd - return True - a, b = x, y - memo = [] +def check_loop(a, b, memo): + if (a, b) in memo: + return memo[(a, b)] while a != b: - if a > b: - a, b = a - b, 2*b - else: - a, b = 2*a, b - a - if (a, b) in memo: + if (a + b) % 2 == 1: # sum is odd + memo[(a, b)] = True return True + if a > b: + a, b = (a - b)/2, b else: - memo += [(a, b)] + a, b = a, (b - a)/2 + memo[(a, b)] = False return False tests = [