def solution(l): remain = sum(l) % 3 if remain == 0: largest_number = get_largest_number(l) return largest_number (category_0, category_1, category_2) = split_digits_by_remain_of_three(l) if remain == 1: category_1, category_2 = remove_one_or_two_digits(category_1, category_2) else: category_2, category_1 = remove_one_or_two_digits(category_2, category_1) if (category_1 == False) or (category_2 == False): return 0 largest_number = get_largest_number(category_0 + category_1 + category_2) return largest_number def split_digits_by_remain_of_three(nums): result = ([], [], []) for n in nums: result[n%3].append(n) return result def remove_one_or_two_digits(list1, list2): if len(list1) >= 1: return sorted(list1)[1:], list2 if len(list2) >= 2: return list1, sorted(list2)[2:] return False, False def get_largest_number(nums): if len(nums) == 0: return 0 return int(''.join([str(x) for x in sorted(nums, reverse=True)])) test_cases=[ [3, 1, 4, 1], [3, 1, 4, 1, 5, 9], [5, 5], [0, 0, 9,9,9,9,9,9,9,9,7], [0, 0, 0,0,0,0], [0, 0, 0,0,0,0, 1, 1, 1], [1], [1, 1], [1, 2], [1, 1, 1], [], [0], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [3, 3, 3, 0, 1, 1, 2, 2], [3, 3, 3, 0, 1, 2, 2], [3, 3, 3, 0, 1, 1, 2], [1, 0, 0, 0], [2, 0, 0, 0], [3, 0, 0, 0, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] ] for test in test_cases: print(test, solution(test))