BOJ/๐Ÿฅˆ

โ˜…Binary Search Upper-Intermediate I - 4 Solvedโ˜…

metamong 2023. 2. 9.

๐Ÿ˜ป ์ด๋ถ„ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด์•ผ ํ•จ์„ ์ธ์ง€ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค. ์ด๋ถ„ํƒ์ƒ‰์„ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜ ํŒ๋ณ„๋ฒ•์€

 

โ‘  ๋…ธ๊ฐ€๋‹ค์„ฑ์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ผ๋‹จ, ๋‚ด๊ฐ€ ์›ํ•˜๊ณ ์ž ํ•˜๋Š”, ๋ฌด์–ธ๊ฐ€๋ฅผ ์ผ์ผ์ด ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด๊ฐ€๋ฉฐ ๋น„๊ตํ•ด๊ฐ€๋Š” ๊ณผ์ •์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์ด๋ถ„ํƒ์ƒ‰ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ์ƒ‰ ์œ ํ˜•์ž„์„ ๊ณ ๋ คํ•ด๋ณด์ž

 

โ‘ก ~์ž๋ฅด๊ธฐ์™€ ๊ฐ™์€ ์ฃผ์–ด์ง„ ์ตœ์†Œ, ์ตœ๋Œ€ ์ผ๋ ฌ๋กœ ๋‚˜์—ด๋œ ์ค„์—์„œ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ๊ฐ€๋ฉฐ ์ตœ์ข… target(point์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์ฃผ์–ด์ง„ ๋ฒ”์œ„์˜ ๊ธธ์ด์ผ ์ˆ˜๋„ ์žˆ๋‹ค)์„ ์ฐพ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ์ด๋ถ„ํƒ์ƒ‰์„ ๊ณ ๋ คํ•ด๋ณด์ž


โ˜… 1654 ๋žœ์„  ์ž๋ฅด๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline

K,N=map(int,input().split())
ls=[int(input())for _ in range(K)]

start,end=1,max(ls) #0,max(ls)-1 x
ans=0
while start<=end:
    cnt=0
    mid=(start+end)//2

    for l in ls:
        cnt+=(l//mid)

    if cnt>=N:
        ans=mid
        start=mid+1

    else:
        end=mid-1
print(ans)

 

๐Ÿ˜ป ์ด๋ถ„ํƒ์ƒ‰ ์œ ํ˜•์ž„์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”

 

๐Ÿ˜ป ์—ฌ๋Ÿฌ ๋žœ์„  ์ค‘ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ max๋กœ ์žก์€ ๋’ค, ์ •ํ™•ํžˆ 1๋ถ€ํ„ฐ max ์‚ฌ์ด์˜ ์ค‘๊ฐ„ ๊ธธ์ด๋ถ€ํ„ฐ ์‹œ์ž‘

 

โ‘  ๊ฐ ๋žœ์„ ๋ณ„๋กœ ์ค‘๊ฐ„๊ธธ์ด์˜ ๋žœ์„ ์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ์˜ ๊ฐœ์ˆ˜ count

 

โ‘ก ๋งŒ์•ฝ, N ์ด์ƒ์ด๋ผ๋ฉด, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ„๊ฒฉ ๋žœ์„  ๊ธธ์ด๋ฅผ ๋” ๋Š˜๋ ค์„œ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ start=mid+1๋กœ ๋†“๊ณ  ํƒ์ƒ‰

(๋ฌธ์ œ์— 'N๊ฐœ๋ณด๋‹ค ๋งŽ์ด ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ N๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ํฌํ•จ๋œ๋‹ค')

 

โ‘ข N๋ฏธ๋งŒ์ด๋ผ๋ฉด, ๊ฐ„๊ฒฉ ๋žœ์„  ๊ธธ์ด๋ฅผ ๋” ์ค„์ผ ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ end=mid-1๋กœ ๋†“๊ณ  ํƒ์ƒ‰

 

โ‘ฃ start<=end๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณต (end ์ดˆ๊ธฐ๊ฐ’์„ ์• ์ดˆ์— ์ œ์ผ ๊ธด ๋žœ์„ ์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋žœ์„ ์˜ ๊ธธ์ด๊ฐ€ ์ด๋ณด๋‹ค ๋” ์ž‘๊ฑฐ๋‚˜ ํด ํ™•๋ฅ  x)


โ˜… 2512 ์˜ˆ์‚ฐ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
budgets=list(map(int,input().split()))
max_budget=int(input())

end=max(budgets)
start=1
ans=1
mid=(start+end)//2
while start<=end:
    s=0
    mid=(start+end)//2

    for budget in budgets:
        if mid<budget:s+=mid
        else:s+=budget

    if max_budget>=s: #need to increase the budget line
        start=mid+1
        ans=max(ans,mid)
    else: #decrease the budget line
        end=mid-1
print(ans)

 

๐Ÿ˜ป ์ƒํ•œ์•ก์„ target์œผ๋กœ ์ฐพ์•„์•ผ ํ•˜๊ณ , ๋…ธ๊ฐ€๋‹ค์„ฑ(?)์œผ๋กœ ์ผ์ผ์ด ์ตœ๋Œ€์˜ˆ์‚ฐ์— ์ œ์ผ ๊ฐ€๊นŒ์šด ์ƒํ•œ์•ก์ธ์ง€ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๊ธฐ์—, (1) target ํƒ์ƒ‰ + (2) ์กฐ๊ฑด ๋ถ€ํ•ฉ ์—ฌ๋ถ€ - ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฏ€๋กœ ์ด๋ถ„ํƒ์ƒ‰ ์œ ํ˜•

 

๐Ÿ˜ป ์ด๋ถ„ํƒ์ƒ‰ ์ฃผ์˜์ ) ์ˆ˜๊ฐ€ ์ œ์ผ ์ž‘์„ ๋•Œ, ํ•ญ์ƒ ์˜ˆ์™ธ ์„ค์ • ํ™•์ธํ•˜๊ธฐ

→ ๋งŒ์•ฝ ์ตœ์†Ÿ๊ฐ’ 3๊ฐœ์˜ ์ง€๋ฐฉ์ด ์กด์žฌํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์˜ˆ์‚ฐ์ด 1, 1, 1์ด๋ฉฐ ์ด ์˜ˆ์‚ฐ์€ 3์ด๋ผ๋ฉด, ์ƒํ•œ์•ก์€ 1๋กœ default ์„ค์ • (์ตœ์†Œ 1์€ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•จ) (ans=1)

 

๐Ÿ˜ป ์ด๋ถ„ํƒ์ƒ‰ ์ง„ํ–‰ → mid๋ฅผ ์ƒํ•œ์•ก์œผ๋กœ ์ •ํ•˜๊ณ , if๋ฌธ์œผ๋กœ ๋ถ€ํ•ฉํ•˜๋Š” ์ง€ ํ™•์ธ, ์ด ๋•Œ max_budget ์ด ์˜ˆ์‚ฐ๋ณด๋‹ค ์ž‘๊ฒŒ ๋‚˜์™”๋‹ค๋ฉด, ๋‹ต์˜ ํ›„๋ณด๊ฐ€ ๋˜๋ฏ€๋กœ ์ˆ˜์‹œ๋กœ max(ans,mid) updateํ•ด, ๋‹ต์˜ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ans ๋ณ€์ˆ˜๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ์„ค์ •!


โ˜… 2805 ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline
from collections import Counter

N,M=map(int,input().split())
trees=Counter(map(int,input().split()))

start=0
end=max(trees)
res=0

while start<=end:
    total=0
    mid=(start+end)//2

    cut=[(h-mid)*trees[h] for h in trees if h>mid]
    
    if sum(cut)>=M:
        res=max(res,mid)
        start=mid+1
    else:
        end=mid-1
print(res)

 

๐Ÿ˜ป ๋…ธ๊ฐ€๋‹ค์„ฑ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ž๋ฅด๋ฉด์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘ ๋‚˜๋ฌด๋ฅผ ์ž๋ฅด๋Š” ๋†’์ด ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ → ์ด๋ถ„ํƒ์ƒ‰ ์‚ฌ์šฉ!

 

๐Ÿ˜ป collections์˜ Counter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, Counter ํ•จ์ˆ˜๋กœ ์ค‘๋ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ๋†’์ด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ผ์ผ์ด if๋ฌธ์„ ๋Œ์ง€ ์•Š๊ณ , ๋ฐ˜ํ™˜ํ˜• dictionary์˜ value๋ฅผ ๊ทธ๋Œ€๋กœ ๊ณฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ

 

ex)

from collections import Counter
print(Counter(["hi", "hey", "hi", "hi", "hello", "hey"])) #Counter({'hi': 3, 'hey': 2, 'hello': 1})


โ˜… 2343 ๊ธฐํƒ€ ๋ ˆ์Šจ โ˜…

 

import sys
input=sys.stdin.readline

N,M=map(int,input().split())
l=list(map(int,input().split()))
start,end=max(l),sum(l)
while start<=end:
    mid=(start+end)//2
    grp_sum=0
    cnt=1
    for x in l:
        grp_sum+=x
        if grp_sum>mid:
            grp_sum=x
            cnt+=1
            if cnt>M:
                break
    if cnt>M:
        start=mid+1
    else:
        ans=mid
        end=mid-1
print(ans)

 

๐Ÿ˜ป ์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ํ•œ ๋ฒˆ์— ์„ค๋ช…๋œ๋‹ค.

: ๋ธ”๋ฃจ๋ ˆ์ด ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๋Š” ์ž‘์•„์ง€๋Š” ๋ฐ˜๋น„๋ก€ ๊ด€๊ณ„. ans update ๊ฐ€๋Šฅํ•œ ๊ตฌ๊ฐ„์€ ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๊ฐ€ M๋ณด๋‹ค ์ž‘์€ ์ผ€์ด์Šค๋กœ ๋ฌธ์ œ์— '๋ธ”๋ฃจ๋ ˆ์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€๊ธ‰์  ์ค„์ด๋ ค๊ณ  ํ•œ๋‹ค'๋ผ๊ณ  ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ. ๊ฐ€๋Šฅ๊ณผ ๋ถˆ๊ฐ€๋Šฅ ์˜์—ญ์„ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์„œ ans update ์ฝ”๋“œ๋ฅผ ์ ์ ˆ if๋ฌธ ๋„ฃ๊ธฐ

์ถ”๊ฐ€๋กœ start์™€ end๋Š” x๊ฐ€ ๋ฌถ์Œํ•ฉ์ด๋ฏ€๋กœ ์ตœ์†Ÿ๊ฐ’ ๋‹จ์ผ 1๊ฐœ ๋ฌถ์Œํ•ฉ๋ถ€ํ„ฐ ์ „์ฒด ํ•ฉ๊นŒ์ง€์˜ ๋ฒ”์œ„ ์„ค์ •


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€