BOJ/๐Ÿฅˆ

โ˜…Binary Search Intermediate I - 7 Solvedโ˜…

metamong 2022. 12. 7.

 

๐Ÿ‘ฉ๐Ÿผ‍๐Ÿ”ฌ 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() ํ•จ์ˆ˜ ํ™œ์šฉ)๋ฅผ ๋นผ๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


 

 

 

 

 

 

๋Œ“๊ธ€