BOJ/๐Ÿฅ‡

โ˜…Binary Search Advanced I - 2 Solvedโ˜…

metamong 2023. 12. 29.

โ˜… 2295 ์„ธ ์ˆ˜์˜ ํ•ฉ โ˜…

 

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 l[mid] == target:return True
        elif l[mid] > target:
            end=mid-1
        else:
            start=mid+1
    return False



#O(N^2logN)
N=int(input())
U=set()
for _ in range(N): U.add(int(input()))
L=list(U)
L.sort()

two=[]
for x in range(len(L)):
    for y in range(x,len(L)):
        two.append(L[x]+L[y])
two.sort()
for x in range(len(L)-1,-1,-1):
    for y in range(0,x):
        if binary_search(L[x]-L[y],two):
            print(L[x])
            sys.exit()

 

๐ŸŽ† (์ค‘๋ณตํ•ด์„œ) ์„ธ ์ˆ˜์˜ ํ•ฉ์ด ์ง‘ํ•ฉ U์— ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘ ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ ๋ฌธ์ œ๋กœ, ์ด๋ถ„ํƒ์ƒ‰ ์‘์šฉ๋ฌธ์ œ. ๋ฌด์–ธ๊ฐ€ ๋‘ ๊ฐœ๋ฅผ ๋ฌถ๊ณ  ๋‚˜๋จธ์ง€ ํ•œ ์ชฝ์˜ ๊ฐ’์„ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ฐพ์•„๋‚ด๋Š” ์œ ํ˜•

 

๐ŸŽ†

โ‘  two []์— ๋‘ ๊ฐœ์˜ ํ•ฉ ์ €์žฅ

โ‘ก two list์—์„œ ์ด๋ถ„ํƒ์ƒ‰ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ •๋ ฌ 

โ‘ข ์„ธ ์ˆ˜์˜ ํ•ฉ ํ›„๋ณด๋ฅผ ์ตœ๋Œ“๊ฐ’๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ two list์— binary search ํƒ์ƒ‰ → ์ฐพ์œผ๋ฉด ์„ธ ์ˆ˜์˜ ํ•ฉ ์ตœ๋Œ“๊ฐ’ ๋ฐ”๋กœ ์ฐพ์•˜์œผ๋ฏ€๋กœ sys.exit()

(๋ฌด์กฐ๊ฑด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์žˆ์œผ๋ฏ€๋กœ ์—†๋Š” ๊ฒฝ์šฐ ๊ณ ๋ ค x)

 

๐ŸŽ† ์„ธ ์ˆ˜์™€ ํ•ฉ๊นŒ์ง€ O(N^4) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋จผ์ € ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊พธ๋กœ ์ „์ฒด์—์„œ ํ•œ ์ˆ˜๋ฅผ ๋บ€ ๊ฒฐ๊ณผ๊ฐ€ ๋‘ ์ˆ˜์˜ ํ•ฉ์— ์žˆ๋Š” ์ง€(binary search) ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” [์ „์ฒด์—์„œ ํ•œ ์ˆ˜๋ฅผ ๋บ€ ๊ฒฐ๊ณผ ๋งŒ๋“ค๊ธฐ O(N^2)] ๊ณฑํ•˜๊ธฐ [binary search ์‹œ๊ฐ„๋ณต์žก๋„(O(log(N^2)) - two list ๊ธธ์ด N^2]

: ๋”ฐ๋ผ์„œ ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2log(N^2))๋กœ O(N^2log(N))๋งŒ์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


โ˜… 3079 ์ž…๊ตญ์‹ฌ์‚ฌ โ˜…

 

import sys
input=sys.stdin.readline

N,M=map(int,input().split())
Ts=[int(input()) for _ in range(N)]
Ts.sort()
start,end=min(Ts),M*max(Ts)

while start<=end:
    mid=(start+end)//2
    total=[mid//T for T in Ts]
    total_T=sum(total)
    if total_T >= M:
        ans=mid
        end=(mid-1)
    else:
        start=mid+1

print(ans)

 

๐ŸŽ† ์ตœ์ ์˜ ์ตœ์†Ÿ๊ฐ’ ์‹œ๊ฐ„์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ตœ์†Ÿ๊ฐ’ + ์ตœ๋Œ“๊ฐ’ ์‹œ๊ฐ„ ๋„ฃ๊ณ  ์ด๋ถ„ํƒ์ƒ‰ ๋Œ๋ฆฌ๋Š” ์ „ํ˜•์ ์ธ ๋ฌธ์ œ

 

๐ŸŽ†

โ‘  start, end ์„ค์ •: start๋Š” ์‹ฌ์‚ฌ๋Œ€ ์ค‘ ๊ฐ€์žฅ ์งง๊ฒŒ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ / end๋Š” ๊ฐ€์žฅ ๊ธธ๊ฒŒ ๊ฑธ๋ฆฌ๋Š” ์‹ฌ์‚ฌ๋Œ€์— ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค ๋‹ค ์ค„ ์„  ์ตœ๋Œ“๊ฐ’ ์‹œ๊ฐ„

โ‘ก mid ๊ตฌํ•˜๋ฉฐ binary search ์ง„ํ–‰

โ‘ข mid๋กœ ๊ตฌํ•œ ์‹œ๊ฐ„ ๋‚ด์— ๊ฐ ์‹ฌ์‚ฌ๋Œ€๋ณ„ ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์ตœ๋Œ€ ์ธ์› ์ˆ˜ ๋ชจ๋‘ ๋”ํ•œ ํ•ฉ์ด ์ธ์› ์ˆ˜ M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด mid๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด end = mid - 1(์ด ๋•Œ๋Š” ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ans์— mid ์—…๋ฐ์ดํŠธ) / ๊ทธ ๋ฐ˜๋Œ€๋ผ๋ฉด mid๋ฅผ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด start = mid + 1

โ‘ฃ ์ตœ์ข…์ ์œผ๋กœ while๋ฌธ ๋๋‚ฌ์„ ๋•Œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ans ์ถœ๋ ฅ 

→ M๋ช…์„ ๋ชจ๋“  ์‹ฌ์‚ฌ๋Œ€์— ๊ฐ๊ฐ ๋„ฃ์–ด์„œ ๊ฐ€๋Šฅ case๋ฅผ ์ผ์ผ์ด ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•ด ๊ฐ€๋Šฅ ์‹œ๊ฐ„์„ mid๋กœ ํƒ์ƒ‰ํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๊ฐ ์—ฌ๊ถŒ ์‹ฌ์‚ฌ๋Œ€์— ํ•ด๋‹น ๊ฐ€๋Šฅ ์‹œ๊ฐ„ ๋‚ด์— ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์ธ์›์„ ์ญ‰ ๊ตฌํ•ด ์ตœ์ข… ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ€ M๋ช…์„ ๋„˜๋Š” ์ง€ / ์•ˆ ๋„˜๋Š”์ง€์— ๋”ฐ๋ผ ์ด๋ถ„ํƒ์ƒ‰ ์ง„ํ–‰์ด ๋ฐ”๋žŒ์ง(O(logN + log(N)*N))

 

ex) ์œ„ ์˜ˆ์‹œ (1) mid 30์ด๋ผ๋ฉด ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์ธ์›๋ณด๋‹ค ํฌ๋ฏ€๋กœ mid๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด end = mid - 1 / ๋ฐ˜๋Œ€๋กœ (2) mid 5๋ผ๋ฉด ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์ธ์›๋ณด๋‹ค M๋ช…์ด ์ž‘์œผ๋ฏ€๋กœ mid๋ฅผ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด start = mid + 1 ์ง„ํ–‰


 

 

 

 

 

 

 

 

 

 

 

 

'BOJ > ๐Ÿฅ‡' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

โ˜…Backtracking Advanced I - 3 Solvedโ˜…  (1) 2024.01.21
โ˜…DP Upper-Advanced I - 8 Solvedโ˜…  (1) 2024.01.05
โ˜…Coordinate Compression Advanced - 2 Solvedโ˜…  (0) 2023.12.28
โ˜…Tree Advanced I - 1 Solvedโ˜…  (1) 2023.12.22
โ˜…BFS&DFS Advanced I - 10 Solvedโ˜…  (0) 2023.12.15

๋Œ“๊ธ€