๐ฉ๐ผ๐ฌ binary-search์ ํต์ฌ์ ํ์ ๋ฒ์๋ฅผ ์ค์ฌ, ์ํ๋ target์ ์ฐพ๋ ์๊ฐ ๋ณต์ก๋๋ฅผ $O(logN)$์ผ๋ก ์ค์ธ๋ค๋ ๋ฐ ์๋ค.
๐ฉ๐ผ๐ฌ binary-search ๊ฐ๋ต ์์ฝ
โ ์ฃผ์ด์ง array, ์ฐพ๊ณ ์ ํ๋ target, ์์ start์ ๋ end - 4๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
โก start์ end์ ์ค๊ฐ์ mid๋ฅผ ๊ตฌํ๋ค(์ง์์ด๋ฉด ์์์ ์ ์ฌ)
โข mid๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด target์ด๋ฉด ๋! target๋ณด๋ค ํฌ๋ค๋ฉด end๋ฅผ mid-1๋ก, target๋ณด๋ค ์๋ค๋ฉด start๋ฅผ mid+1๋ก ์ค์
โ 13777 Hunt The Rabbit โ
โป binary-search ์ ์ผ Bronze ๋ฌธ์ ์ด์ง๋ง Intermediate ํฌ์คํ ์ ๋ฃ์ โป
def binary_search(n,l,start,end):
a=[]
while start<=end:
mid=(start+end)//2
a.append(mid)
if l[mid]==n:break
elif l[mid]>n:end=mid-1
else:start=mid+1
return a
while 1:
n=int(input())
if n==0:break
l=[i for i in range(0,51)]
start,end=1,50
print(*binary_search(n,l,start,end))
๐ฉ๐ผ๐ฌ ์ด๋ถํ์์์ ์ฃผ์ํด์ผ ํ ๋ถ๋ถ์ start์ end์ ์ค์ & ๋ฒ์ indexing ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
→ 1๋ถํฐ 50๊น์ง ๊ณ ์ ๊ธธ์ด๋ฅผ ํ์ํ๋ฏ๋ก, ์ผ๋ถ๋ฌ list์ 0์ ์ถ๊ฐํด index์ value๊ฐ์ด ๊ฐ๊ฒ ํด ํผ๋์ ํผํจ.
๐ฉ๐ผ๐ฌ ์ด๋ถํ์ํ๋ฉด์ middle envelope์ ๊ณ์ openํ๋ฏ๋ก mid๊ฐ์ ๊ณ์ ๋น list์ ์ง์ด๋ฃ์ผ๋ฉด์ update๋ list์ ๊ฐ๋ค์ ์ญ ์ถ๋ ฅํด์ฃผ๋ฉด ๋จ
โ 1920 ์ ์ฐพ๊ธฐ โ
import sys
input=sys.stdin.readline
def binary_search(array,target,start,end):
while start<=end:
mid=(start+end)//2
if array[mid]==target:return mid
elif array[mid]>target:end=mid-1
else:start=mid+1
return -1
N=int(input())
A=sorted(list(map(int,input().split())))
M=int(input())
for x in map(int,input().split()):
if binary_search(A,x,0,N-1)>=0:print(1)
else:print(0)
๐ฉ๐ผ๐ฌ ์ํ๋ ์ซ์๊ฐ ์๋์ง ์ด๋ถํ์์ผ๋ก ์ฐพ๋ ๋ฌธ์ , start์ end ์ฃผ์ํด์ ๋ฃ๊ธฐ, index start 0, ๊ทธ๋ฆฌ๊ณ ๋งจ ๋ index N-1๋ก end ์ค์
โ 10815 ์ซ์ ์นด๋ โ
import sys
input=sys.stdin.readline
def binary_search(arr,target,start,end):
while start<=end:
mid=(start+end)//2
if arr[mid]==target:return mid
elif arr[mid]>target:end=mid-1
else:start=mid+1
return -1
N=int(input())
arr=sorted(set(map(int,input().split())))
M=int(input())
for num in map(int,input().split()):
if binary_search(arr,num,0,N-1)>=0:print(1,end=' ')
else:print(0,end=' ')
๐ฉ๐ผ๐ฌ ์ด๋ถํ์์ ์ ์! ์ค์ํ๊ฑด, ํ์ํ ๋ฒ์๋ ๋ฏธ๋ฆฌ sorted()๋ก ์ ๋ ฌ์ ํด์ค์ผ ํ๊ณ , start์ end ์ ์ค์ ํ ๊ฒ!
โ 10816 ์ซ์ ์นด๋ 2 โ
from bisect import bisect_left, bisect_right
import sys
input=sys.stdin.readline
ans=[]
def count_by_range(a,left_value,right_value):
right_index = bisect_right(a,right_value)
left_index = bisect_left(a,left_value)
return right_index-left_index
N=int(input())
l=list(map(int,input().split()))
l.sort()
M=int(input())
X=list(map(int,input().split()))
for x in X:ans.append(count_by_range(l,x,x))
print(*ans)
๐ฉ๐ผ๐ฌ ์ด๋ถํ์ ์ด๋ก ํฌ์คํ ์์ ์๊ฐํ ๋๋ก, bisect_left์ bisect_right๋ฅผ ์ฌ์ฉํด ์ํ๋ ์์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
๐ฉ๐ผ๐ฌ ๋๋ Counter(from collections) ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ: ๋น๋์๊ฐ ๋ค์ด๊ฐ hash-map
from collections import Counter
import sys
input=sys.stdin.readline
input()
l=input().split()
input()
X=input().split()
C = Counter(l)
print(*[C[key] for key in X])
๐ฉ๐ผ๐ฌ bisect_left / bisect_right ์ฌ์ฉ ์์ด ํ์ด
import sys
input=sys.stdin.readline
def left(target, l):
st,en=0,len(l)
while st<en:
mid=(st+en)//2
if l[mid]>=target:
en=mid
elif l[mid]<target:
st=mid+1
#when st==en
return st
def right(target, l):
st,en=0,len(l)
while st<en:
mid=(st+en)//2
if l[mid]>target:
en=mid
elif l[mid]<=target:
st=mid+1
#when st==en
return st
N=int(input())
cards=list(map(int,input().split()))
cards.sort()
M=int(input())
targets=list(map(int,input().split()))
for target in targets:
x,y = left(target, cards), right(target, cards)
print(y-x,end=' ')
๐ฉ๐ผ๐ฌ ์ด๋ถ ํ์์ ์๋์ง๋ง hash map์ผ๋ก๋ ํ๋ฆฐ๋ค (defaultdict() ์ฌ์ฉ)
import sys
input=sys.stdin.readline
from collections import defaultdict
freq=defaultdict(int)
N=int(input())
cards=list(map(int,input().split()))
for card in cards:
freq[card]+=1
M=int(input())
l=list(map(int,input().split()))
for x in l:
print(freq[x],end=' ')
โ 13706 ์ ๊ณฑ๊ทผ โ
N=int(input())
if N in [0,1]:
print('01'[N])
else:
start=2
end=N//2
while start<=end:
mid=(start+end)//2
if mid*mid == N:
print(mid)
break
elif mid*mid > N:
end=(mid-1)
else: #mid*mid<N
start=(mid+1)
๐ฉ๐ผ๐ฌ 0๊ณผ 1 ์ ์ธ ๋๋จธ์ง ๋ชจ๋ ์ ๊ณฑ์์ ์ ๊ณฑ๊ทผ์ N/2 ์ดํ์ ๊ฐ์ ์กด์ฌํ๋ฏ๋ก start = 2 / end = N/2์์ ์์ํด ์ ๊ณฑ์๊ฐ ์กด์ฌํ๋ฉด ๋ฐ๋ก ์ถ๋ ฅํ๋ ์ ํ์ ์ธ ์ด๋ถํ์ ๋ฐฉ์
โ 2776 ์๊ธฐ์ โ
import sys
input=sys.stdin.readline
def binary_search(target, l):
start,end=0,len(l)-1
while start<=end:
mid=(start+end)//2
if target==l[mid]: return True
elif target>l[mid]: start=mid+1
else: end=mid-1
return False
for _ in range(int(input())):
N=int(input())
ans=sorted(list(map(int,input().split())))
M=int(input())
Ml=list(map(int,input().split()))
for x in Ml:
print(int(binary_search(x,ans)))
๐ฉ๐ผ๐ฌ ์์ฒฉ2๋ฅผ ๋๋ฆฌ๋ฉด์ ์์ฒฉ1์ ์๋ ์ง ์๋ ์ง ์ด๋ถํ์
โ 26168 ๋ฐฐ์ด ์ ์ฒด ํ์ํ๊ธฐ โ
import sys
input=sys.stdin.readline
def get1(arr,limit):
start,end=0,len(arr)-1
found=False
while start<=end:
mid=(start+end)//2
if arr[mid] < limit:
start=mid+1
else: #arr[mid]>=limit
found=True
end=mid-1
ans=mid
if found:
return (len(arr)-ans)
else:
return 0
def get2(arr,limit):
start,end=0,len(arr)-1
found=False
while start<=end:
mid=(start+end)//2
if arr[mid] <= limit:
start=mid+1
else: #arr[mid]>=limit
found=True
end=mid-1
ans=mid
if found:
return (len(arr)-ans)
else:
return 0
n,m=map(int,input().split())
A=list(map(int,input().split()))
A.sort()
for _ in range(m):
query=list(map(int,input().split()))
if query[0] == 1:
limit = query[1]
print(get1(A,limit))
elif query[0] == 2:
limit = query[1]
print(get2(A,limit))
else: #query[0] == 3
limit_1, limit_2 = query[1], query[2]
print(get1(A,limit_1)-get2(A,limit_2))
๐ฉ๐ผ๐ฌ ์ฃผ์ด์ง ๋ฐฐ์ด ์ ๋ ฌ ๋ค, ์ํ๋ ์ซ์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ซ์๋ค์ ๊ฐ์ / ์ํ๋ ์ซ์๋ณด๋ค ํฐ ์ซ์๋ค์ ๊ฐ์๋ฅผ ๊ตฌํ ๋๋ ์ด๋ถํ์ ํ์ฉ. ๊ฒฝ๊ณ index๋ฅผ ๊ตฌํ ๋ค, ๊ฐ์ฅ ๋ ์์์ index + 1 - ๊ฒฝ๊ณ index๋ฅผ ํ๋ฉด ์ํ๋ ๊ฐ์๊ฐ ๋์จ๋ค. ์ด ๋, ๊ฒฝ๊ณ index๊ฐ ์ ๊ตฌํด์ง๋ ๊ฒฝ์ฐ๋, ์ ์ด์ ๋ง์กฑํ๋ ์ซ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ก 0 ๋ฆฌํด. arr[mid]>= target ๋๋ arr[mid]>target์ผ ๋๋ง ๋ต ๊ตฌํ ์ ์์ผ๋ฏ๋ก ์ด ๋๋ง ์ ๋ฐ์ดํธ
๐ฉ๐ผ๐ฌ ๋ index ์ฌ์ด์ ์ซ์ ๊ฐ์๋, ์์ index๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ซ์์ ๊ฐ์(get1() ํจ์ ํ์ฉ) ์ค ํฐ index๋ณด๋ค ํฐ ์ซ์์ ๊ฐ์(get2() ํจ์ ํ์ฉ)๋ฅผ ๋นผ๋ฉด ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Stack & Queue & Deque Intermediate I - 20 Solvedโ (0) | 2022.12.11 |
---|---|
โ Recursion Intermediate - 2 Solvedโ (0) | 2022.12.11 |
โ Greedy Intermediate I - 20 Solvedโ (0) | 2022.12.05 |
โ Implementation&Simulation Intermediate I - 15 Solvedโ (0) | 2022.11.28 |
โ Math & Geometry Intermediate I - 8 Solvedโ (0) | 2022.11.22 |
๋๊ธ