forked from bellshade/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtriplet_sum.py
97 lines (70 loc) · 2.32 KB
/
triplet_sum.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Diberikan array bilangan bulat dan target bilangan bulat lainnya,
# kita diminta untuk menemukan triplet dari array
# sedemikian rupa sehingga jumlahnya sama dengan
# target.
from __future__ import annotations
from itertools import permutations
from random import randint
from timeit import repeat
def make_dataset() -> tuple[list[int], int]:
arr = [randint(-1000, 1000) for _ in range(10)]
r = randint(-5000, 5000)
return (arr, r)
dataset = make_dataset()
def triplet_sum1(arr: list[int], target: int) -> tuple[int, ...]:
"""
Mengembalikan triplet dalam array dengan jumlah sama dengan target,
lain (0, 0, 0).
>>> triplet_sum1([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> arr = [6, 47, 27, 1, 15]
>>> target = 11
>>> triplet_sum1(arr, target)
(0, 0, 0)
"""
for triplet in permutations(arr, 3):
if sum(triplet) == target:
return tuple(sorted(triplet))
return (0, 0, 0)
def triplet_sum2(arr: list[int], target: int) -> tuple[int, int, int]:
"""
Mengembalikan triplet dalam array dengan jumlah sama dengan target,
lain (0, 0, 0).
>>> triplet_sum2([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> arr = [6, 47, 27, 1, 15]
>>> target = 11
>>> triplet_sum2(arr, target)
(0, 0, 0)
"""
arr.sort()
n = len(arr)
for i in range(n - 1):
kiri, kanan = i + 1, n - 1
while kiri < kanan:
if arr[i] + arr[kiri] + arr[kanan] == target:
return (arr[i], arr[kiri], arr[kanan])
elif arr[i] + arr[kiri] + arr[kanan] < target:
kiri += 1
elif arr[i] + arr[kiri] + arr[kanan] > target:
kanan -= 1
return (0, 0, 0)
def sol_waktu() -> tuple[float, float, float]:
setup_kode = """
from __main__ import dataset, triplet_sum1, triplet_sum2
"""
test_kode1 = """
triplet_sum1(*dataset)
"""
test_kode2 = """
triplet_sum2(*dataset)
"""
waktu1 = repeat(setup=setup_kode, stmt=test_kode1, repeat=5, number=10000)
waktu2 = repeat(setup=setup_kode, stmt=test_kode2, repeat=5, number=10000)
return (min(waktu1), min(waktu2))
if __name__ == "__main__":
from doctest import testmod
testmod()
waktu = sol_waktu()
print(f"solusi pertama memakan waktu : {waktu[0]}")
print(f"sousi kedua memakan waktu : {waktu[1]}")