4월 18, 2022

TIL) 구글 코딩 인터뷰 풀이

 https://www.youtube.com/watch?v=XKu_SEDAykw&t=430 

해당 영상을 보고 풀이 과정을 기록한 코드입니다. 


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
98
99
100
101
102
103
104
105
106
107
108
# 문제
# collection of numbers
# find matching pair equal to sum(given)
# [1,2,3,9]  sum 8
# [1,2,4,4]  sum 8
 
# 매칭 pair 없는 경우도 있음
# memory에 있고, ordered된 상태(ascending)
# repeating element? : 같은 인덱스에 있는 값 재활용 불가능
# 다른 인덱스에 같은 값은 나올 수 있음
# int, 마이너스도 가능
 
# nested for loop 사용 가능 i Loop과 i+1 Loop
# 그러나 O(n^2) 이기에 time consuming함 
 
# 1이라고 치면, 7을 찾으면 되는데.. sorted 돼있기에 binary search하면 된다
# log algorithm 
# 아직 좀 느림
 
ex = [1,2,3,4,4]
 
def binary_search(array, left, right, ele):
  if right >= left:
    mid = (left+right)//2
    if array[mid] == ele:
      return True
    elif array[mid] > ele:
      return binary_search(array,left,mid-1, ele)
    else:
      return binary_search(array,mid+1, right, ele)
  else:
    return False
    
def slightly_better_pair_sum(array,sum):
  for i in range(len(array)):
    comp=sum-array[i]
    if binary_search(array,i+1,len(array)-1,comp):
      return "yes"
  return "No"
 
# 단방향인 binary search보다 
# 가장 큰 sum은 마지막 두 값일 것임
# 가장 작은 sum은 첫 두 값
# 그러니깐, 첫번째 값보다 작은 것은 없고, 마지막 값보다 큰 것은 없음
# range를 가운데로 줄여가며 linear하게 접근
 
# binary search를 하게된다면, 각 element마다 binary search를 반복해야 하는 반면, 이렇게하면 한번의 흐름으로 끝남
 
# python으로 해보자
def findSumPair(array,sum):
  left = 0
  right = len(array)-1
  while right>left:
    if array[left] + array[right] == sum:
      return "yes"
    elif array[left] + array[right] < sum:
      left += 1
    else:
      right -= 1
  return "No"
 
 
# print(findSumPair([1,2,4,4],8))
# O(n) 의 시간 복잡도 
 
 
# sorted 돼있지 않다면? - error check
# sort 한 이후 해당 코드 반복
 
def SortPairSum(array,sum):
  array.sort()
  left = 0
  right = len(array) -1
  while right>left:
    if array[left] + array[right] == sum:
      return "yes"
    elif array[left] + array[right] < sum:
      left += 1
    else:
      right -= 1
  return "No"
 
# print(findSumPair([4,5,2,3,7],8))
 
# 개선점
# O(nlog n)의 시간복잡도
# O(n) 으로 돌아가기 위하여 
  # array를 가면서 만나는 요소를 딕셔너리에 넣음
  # 현재 요소의 complement(요소와 더해서 sum되는 것)없다는 것은
  # array를 loop하면서 현재 요소의 complement가 딕셔너리에 있는지 확인하고
  # 있으면 yes를 리턴
  # 없으면 no를 리턴하고 현재 element를 딕셔너리에 더함
 
def smartestPairSum(array,sum):
  dictionary = dict()
  for item in array:
    comp = sum - item
    if not comp in dictionary:
      dictionary[item] = True
    else:
      return "YES"
  return "No"
 
print(smartestPairSum([4,5,2,3,7],8))
# 더해서 sum이 되는
# complement1 , complment2이 있을때,
# 먼저 나온 complement1을 기록해두었다가, 이후에 complemnet2 가 나오면 딕셔너리에서 이를 찾아서 합이 되는 수가 있음을 return 하고 끝냄.
# array개수만큼 operation이 늘어나기에 O(n)임
cs

참조 : https://github.com/VicodinAbuser/ZTM-DS-and-Algo-Python/blob/master/venv/Scripts/How%20to%20solve%20coding%20problems/Google%20Interview%20Question.py