Notion에서 작성된 글이라, 여기 에서 더 깔끔하게 보실 수 있습니다! 😮😊
[Search in a Binary Search Tree]
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return None
if val < root.val:
return self.searchBST(root.left, val)
elif val > root.val:
return self.searchBST(root.right, val)
return root
val
이 찾으려는 val
보다 작다면 왼쪽 트리에서 다시 찾고, 찾으려는 val
보다 크다면 오른쪽 트리에서 다시 찾고, val
과 같다면(찾았다면) 반환한다.[1, 2, 3, 4, 5]
와 같은 경우는 값을 찾는 데 (depth만큼) 이 소요된다.class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root or root.val == val:
return root
return self.searchBST(root.left if val<root.val else root.right, val)
root
가 None
일 때 None
을 반환한다는 점과, root.val
이 val
과 같을 때 root
를 반환한다는 점을 고려하여, Short Circuit Rule을 생각해 주면 위와 같이 축약할 수 있다.class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
while root and root.val != val:
root = root.left if val<root.val else root.right
return root
root
가 존재하며 그 root.val
이 찾고자 하는 val
이 아닐 때 계속해서 트리의 왼쪽 또는 오른쪽으로 움직여가며 값 찾기를 시도한다.input()
cards = {*input().split()}
input()
for s in input().split():
print(int(s in cards), end=' ')
n = int(input())
cards = sorted(map(int, input().split()))
input()
def bs(s):
l, r = 0, n-1
while l<=r:
m = (l+r)//2
if s == cards[m]: return 1
if s < cards[m]:
r = m-1
else:
l = m+1
return 0
for s in map(int, input().split()):
print(bs(s), end=' ')
1
을 반환하고, 이분 탐색을 마칠 때까지 카드를 찾지 못하면 0
을 반환한다. 이분 탐색을 이용하여 매 쿼리마다 에 처리할 수 있게 된다.[BOJ 3079. 입국심사] 와 같은 문제이다.
def solution(n, times):
def check(n, m):
for t in times:
n -= m//t
if n<=0: return True
return False
l, r = 1, max(times)*n
while l<=r:
m = (l+r)//2
if check(n, m):
r = m-1
else:
l = m+1
return l
결정 문제로 변환
m
)을 정하고, 이 시간 내에 “입국심사를 모두 마칠 수 있는지” 의 결정 문제로 변환했다.m
) 내에 몇 명까지 심사를 할 수 있는지 계산하여 합친 값이 입국심사를 기다리는 사람의 수 이상이라면 해당 시간 내에 입국심사를 마칠 수 있는 것이다.m
) 내에 몇 명까지 심사를 할 수 있는지 계산하여, 심사한 인원들을 빼줌으로써 을 갱신해 주다가, 이 이하가 된다는 것은 더이상 입국심사를 기다리는 사람이 없다는 것이므로 바로 True
를 return하여 조기종료해준다.이분 탐색 적용
max(times)*n
으로 설정해주면 범위를 탐색 초기부터 타이트하게 잡게 되어 이분 탐색의 횟수를 줄여주기 때문에(매 탐색마다 으로 check()
를 수행하기 때문에 탐색의 횟수를 줄이는 것이 실행 시간 면에서 유의미함) 인 경우 더 빠르다. (times
의 최댓값을 구하는 데 이 소요되므로)Challenger.