Skip to content

Commit 89215f3

Browse files
committed
update
1 parent dff49b4 commit 89215f3

File tree

280 files changed

+3097
-815
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

280 files changed

+3097
-815
lines changed

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"python.linting.pylintEnabled": false,
3+
"python.linting.pep8Enabled": true,
4+
"python.linting.enabled": true
5+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from binary_search import binary_search_iter
2+
3+
4+
# 파이썬 set 사용
5+
def intersection_two_arrays_sets(seq1, seq2):
6+
set1 = set(seq1)
7+
set2 = set(seq2)
8+
return set1.intersection(set2)
9+
10+
11+
# 병합 정렬 사용
12+
def intersection_two_arrays_ms(seq1, seq2):
13+
res = []
14+
while seq1 and seq2:
15+
if seq1[-1] == seq2[-1]:
16+
res.append(seq1.pop())
17+
seq2.pop()
18+
elif seq1[-1] > seq2[-1]:
19+
seq1.pop()
20+
else:
21+
seq2.pop()
22+
res.reverse()
23+
return res
24+
25+
26+
# 이진 검색 사용
27+
def intersection_two_arrays_bs(seq1, seq2):
28+
if len(seq1) > len(seq2):
29+
seq, key = seq1, seq2
30+
else:
31+
seq, key = seq2, seq1
32+
intersec = []
33+
for item in key:
34+
if binary_search_iter(seq, item):
35+
intersec.append(item)
36+
return intersec
37+
38+
39+
def test_intersection_two_arrays():
40+
seq1 = [1, 2, 3, 5, 7, 8]
41+
seq2 = [3, 5, 6]
42+
assert(set(intersection_two_arrays_sets(seq1, seq2)) == set([3, 5]))
43+
assert(intersection_two_arrays_bs(seq1, seq2) == [3, 5])
44+
assert(intersection_two_arrays_ms(seq1, seq2) == [3, 5])
45+
print('테스트 통과!')
46+
47+
48+
if __name__ == "__main__":
49+
test_intersection_two_arrays()
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
def sequential_search(seq, n):
2+
for item in seq:
3+
if item == n:
4+
return True
5+
return False
6+
7+
8+
def test_sequential_search():
9+
seq = [1, 5, 6, 8, 3]
10+
n1 = 5
11+
n2 = 7
12+
assert(sequential_search(seq, n1) == True)
13+
assert(sequential_search(seq, n2) == False)
14+
print('테스트 통과!')
15+
16+
17+
if __name__ == "__main__":
18+
test_sequential_search()
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
def ordered_sequential_search(seq, n):
2+
item = 0
3+
for item in seq:
4+
if item > n:
5+
return False
6+
if item == n:
7+
return True
8+
return False
9+
10+
11+
def test_ordered_sequential_search():
12+
seq = [1, 2, 4, 5, 6, 8, 10]
13+
n1 = 10
14+
n2 = 7
15+
assert(ordered_sequential_search(seq, n1) == True)
16+
assert(ordered_sequential_search(seq, n2) == False)
17+
print('테스트 통과!')
18+
19+
20+
if __name__ == "__main__":
21+
test_ordered_sequential_search()

10장_검색/3_quick_select.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import random
2+
3+
4+
def quickSelect(seq, k):
5+
# 이 부분은 퀵 정렬과 같다.
6+
len_seq = len(seq)
7+
if len_seq < 2:
8+
return seq[0]
9+
# 피벗을 무작위로 선택할 수 있다.
10+
# pivot = random.choice(seq)
11+
ipivot = len_seq // 2
12+
pivot = seq[ipivot]
13+
14+
smallerList = [x for i, x in enumerate(seq) if x <= pivot and i != ipivot]
15+
largerList = [x for i, x in enumerate(seq) if x > pivot and i != ipivot]
16+
17+
# 이 부분에서 퀵 정렬과 다르다.
18+
m = len(smallerList) + 1
19+
if k == m:
20+
return pivot
21+
elif k < m:
22+
return quickSelect(smallerList, k)
23+
else:
24+
return quickSelect(largerList, k-m-1)
25+
26+
27+
if __name__ == "__main__":
28+
seq = [10, 60, 100, 50, 60, 75, 31, 50, 30, 20, 120, 170, 200]
29+
# seq = [3, 7, 2, 1, 4, 6, 5, 10, 9, 11]
30+
31+
k = len(seq) // 2
32+
print(sorted(seq))
33+
print(quickSelect(seq, k))
34+
# 중앙값(median) 출력을 위해서 넘파이를 사용함
35+
import numpy
36+
print(numpy.median(seq))

10장_검색/4_binary_search.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# 재귀함수
2+
def binary_search_rec(seq, target, low, high):
3+
if low > high:
4+
return None
5+
mid = (low + high) // 2
6+
if target == seq[mid]:
7+
return mid
8+
elif target < seq[mid]:
9+
return binary_search_rec(seq, target, low, mid-1)
10+
else:
11+
return binary_search_rec(seq, target, mid+1, high)
12+
13+
14+
# 반복문
15+
def binary_search_iter(seq, target):
16+
high, low = len(seq), 0
17+
while low < high:
18+
mid = (high + low) // 2
19+
if target == seq[mid]:
20+
return mid
21+
elif target < seq[mid]:
22+
high = mid
23+
else:
24+
low = mid + 1
25+
return None
26+
27+
28+
def test_binary_search():
29+
seq = [1, 2, 5, 6, 7, 10, 12, 12, 14, 15]
30+
target = 6
31+
assert(binary_search_iter(seq, target) == 3)
32+
assert(binary_search_rec(seq, target, 0, len(seq)) == 3)
33+
print('테스트 통과!')
34+
35+
36+
if __name__ == "__main__":
37+
test_binary_search()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
def find_elem_matrix_bool(m1, value):
2+
found = False
3+
row = 0
4+
col = len(m1[0]) - 1
5+
while row < len(m1) and col >= 0:
6+
if m1[row][col] == value:
7+
found = True
8+
break
9+
elif m1[row][col] > value:
10+
col -= 1
11+
else:
12+
row += 1
13+
return found
14+
15+
16+
def test_find_elem_matrix_bool():
17+
m1 = [[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]]
18+
assert(find_elem_matrix_bool(m1, 8) == True)
19+
assert(find_elem_matrix_bool(m1, 3) == False)
20+
m2 = [[0]]
21+
assert(find_elem_matrix_bool(m2, 0) == True)
22+
print('테스트 통과!')
23+
24+
25+
if __name__ == "__main__":
26+
test_find_elem_matrix_bool()
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
def searching_in_a_matrix(m1, value):
2+
rows = len(m1)
3+
cols = len(m1[0])
4+
lo = 0
5+
hi = rows*cols
6+
while lo < hi:
7+
mid = (lo + hi) // 2
8+
row = mid // cols
9+
col = mid % cols
10+
v = m1[row][col]
11+
if v == value:
12+
return True
13+
elif v > value:
14+
hi = mid
15+
else:
16+
lo = mid+1
17+
return False
18+
19+
20+
def test_searching_in_a_matrix():
21+
a = [[1, 3, 5], [7, 9, 11], [13, 15, 17]]
22+
import numpy
23+
b = numpy.array([(1, 2), (3, 4)])
24+
assert(searching_in_a_matrix(a, 13) == True)
25+
assert(searching_in_a_matrix(a, 14) == False)
26+
assert(searching_in_a_matrix(b, 3) == True)
27+
assert(searching_in_a_matrix(b, 5) == False)
28+
print('테스트 통과!')
29+
30+
31+
if __name__ == "__main__":
32+
test_searching_in_a_matrix()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
def find_max_unimodal_array(A):
2+
if len(A) <= 2:
3+
return None
4+
left = 0
5+
right = len(A)-1
6+
while right > left + 1:
7+
mid = (left + right) // 2
8+
if A[mid] > A[mid-1] and A[mid] > A[mid+1]:
9+
return A[mid]
10+
elif A[mid] > A[mid-1] and A[mid] < A[mid+1]:
11+
left = mid
12+
else:
13+
right = mid
14+
return None
15+
16+
17+
def test_find_max_unimodal_array():
18+
seq = [1, 2, 5, 6, 7, 10, 12, 9, 8, 7, 6]
19+
assert(find_max_unimodal_array(seq) == max(seq))
20+
print('테스트 통과!')
21+
22+
23+
if __name__ == "__main__":
24+
test_find_max_unimodal_array()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
def find_sqrt_bin_search(n, error=0.001):
2+
lower = n < 1 and n or 1
3+
upper = n < 1 and 1 or n
4+
mid = lower + (upper - lower) / 2.0
5+
square = mid * mid
6+
while abs(square - n) > error:
7+
if square < n:
8+
lower = mid
9+
else:
10+
upper = mid
11+
mid = lower + (upper - lower) / 2.0
12+
square = mid * mid
13+
return mid
14+
15+
16+
if __name__ == "__main__":
17+
a = 2
18+
b = 9
19+
import math
20+
print(math.sqrt(a))
21+
print(find_sqrt_bin_search(a))
22+
print(math.sqrt(b))
23+
print(find_sqrt_bin_search(b))

0 commit comments

Comments
 (0)