Skip to main content

Binary_search

BOJ 34609 Secret Lilies and Roses

·960 words·5 mins
πŸ“ 문제 정보 # 링크: https://www.acmicpc.net/problem/34609 λ²ˆμ—­ 문제 # $1$λ²ˆλΆ€ν„° $n$λ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨진 $n$μ†‘μ΄μ˜ 꽃이 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 일렬둜 놓여 μžˆλ‹€. 각 꽃은 λ°±ν•©(lily) λ˜λŠ” μž₯λ―Έ(rose) 쀑 ν•˜λ‚˜μ΄λ‹€. $0$ 이상 $n$ μ΄ν•˜μ˜ μ •μˆ˜ $j$에 λŒ€ν•΄, $l_j$λ₯Ό μ™Όμͺ½ $j$개의 꽃 쀑 λ°±ν•©μ˜ 수, $r_j$λ₯Ό 였λ₯Έμͺ½ $n - j$개의 꽃 쀑 μž₯미의 수라 ν•˜μž.

BOJ 31498 μž₯λ‚œμ„ 잘 μΉ˜λŠ” ν† μΉ΄ μ–‘

·292 words·2 mins
πŸ“ 문제 정보 # 링크: https://www.acmicpc.net/problem/31498 🧐 κ΄€μ°° 및 μ ‘κ·Ό # μ§‘ - ν† μΉ΄ - 돌돌이 ν˜•νƒœλ‘œ μžˆλŠ” 것 κ°™λ‹€. λ§€ μˆ˜ν–‰λ§ˆλ‹€ ν† μΉ΄λŠ” $B, B-K, B-2*K \cdots$ 만큼 움직이고, λŒλŒμ΄λŠ” $D$만큼 계속 움직인닀. ν† μΉ΄κ°€ μž‘νžŒλ‹€λ©΄, κ·Έ μˆœκ°„ ν† μΉ΄κ°€ 움직인 κΈΈμ΄λŠ” $D$보닀 μž‘μ„ 것이닀. λ”°λΌμ„œ ν† μΉ΄κ°€ μ–΄λŠ μˆœκ°„ μž‘ν˜”λ‹€λ©΄, 토카와 λŒλŒμ΄κ°€ 계속 움직인닀고 κ°€μ •ν•˜λ©΄ λŒλŒμ΄λŠ” 토카보닀 훨씬 μ™Όμͺ½μ— 있게 λœλ‹€. λ”°λΌμ„œ μ‹œκ°„μ— 토카와 돌돌이의 μœ„μΉ˜μ— 단쑰성이 μ‘΄μž¬ν•œλ‹€. 이뢄 탐색을 μ΄μš©ν•  수 μžˆκ² λ‹€. ν† μΉ΄κ°€ 집에 λ„μ°©ν•˜μ§€λ„ λͺ»ν•˜λŠ” 상황, $K$κ°€ 0인상황 λ“± μ—¬λŸ¬κ°€μ§€ μ˜ˆμ™Έ 상황을 μ‘°μ‹¬ν•˜μž. πŸ’» 풀이 # μ½”λ“œ (python): A, B = map(int, input().split()) C, D = map(int, input().split()) K = int(input()) # ν† μΉ΄κ°€ 집에 도착할 μˆ˜λŠ” μžˆλŠ”κ°€? # B + (B-K) + (B-2K) + ... >= A if K > 0: # K = 0이면 무쑰건 도착할 수 있음 cnt = B // K # B - cnt * K >= 0 인 μ΅œλŒ€ cnt tot = B * (cnt + 1) - K * (cnt * (cnt + 1)) // 2 # B + (B-K) + ... + (B - cnt * K) if tot < A: print(-1) exit(0) # ν† μΉ΄κ°€ 집에 λ„μ°©ν•˜λŠ” 타이밍이 λŒλŒμ΄λ³΄λ‹€ 이λ₯Έκ°€? def toka_move(time): if K > 0: time = min(time, B // K + 1) return B * time - K * (time * (time - 1)) // 2 ok, ng = 10**12, 0 # ν† μΉ΄κ°€ 집에 λ„μ°©ν•˜λŠ” κ°€μž₯ λΉ λ₯Έ 타이밍 while ok - ng > 1: mid = (ok + ng) // 2 if toka_move(mid) >= A: ok = mid else: ng = mid if D*ok < A + C: # 아직 λŒλŒμ΄κ°€ λ„μ°©ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ print(ok) else: print(-1) πŸ”’ κ΅¬ν˜„ μ½”λ“œ 잠금

BOJ 20929 쀑간

·238 words·2 mins
πŸ“ 문제 정보 # 링크: https://www.acmicpc.net/problem/20929 🧐 κ΄€μ°° 및 μ ‘κ·Ό # 문제의 μ œν•œμΈ $2^{19}$와 횟수λ₯Ό λ³Όλ•Œ, 이뢄 탐색을 μž₯λ €ν•˜κ³  μžˆλŠ” 것 κ°™λ‹€. λ‹€μŒκ³Ό 같은 상황을 μƒκ°ν•΄λ³΄μž. ![[Drawing 2026-02-10 14.25.24.excalidraw.png]] 길이 8의 λ°°μ—΄ 2κ°œμ—μ„œ λ‹€μŒκ³Ό 같이 $N/2$번째 수인 4번째 수λ₯Ό λΉ„κ΅ν–ˆμ„ λ•Œ, μœ„μ™€ 같이 μž‘μ€ λ°°μ—΄μ˜ μ•„λž˜ 절반과 큰 λ°°μ—΄μ˜ μœ—μͺ½ μ ˆλ°˜μ€ κ³ λ €ν•  ν•„μš”κ°€ μ—†μ–΄μ§„λ‹€. ![[Drawing 2026-02-10 14.31.00.excalidraw.png]] μœ„μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, μœ„μ—μ„œ μž‘μ€ λ°°μ—΄ μͺ½ 4개λ₯Ό μ œμ™Έν•˜κ³  보면 $N$이 절반으둜 쀄어든 μƒν™©μ—μ„œ 같은 λ°©μ‹μœΌλ‘œ λ°˜λ³΅ν•  수 μžˆμŒμ„ μ•Œ 수 μžˆλ‹€. λ”°λΌμ„œ μœ„μ™€ 같은 과정을 1κ°œκ°€ λ‚¨μ„λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄ 두 값은 각각 $N, N+1$번째 값일 것이닀. λ¬Έμ œμ—μ„œλŠ” $N$번째 수λ₯Ό μš”κ΅¬ν–ˆμœΌλ―€λ‘œ, 더 μž‘μ€ 수λ₯Ό 좜λ ₯ν•˜μž. πŸ’» 풀이 # μ½”λ“œ (python): def Query(s, idx): """ 질문 "? s idx"을 ν•˜κ³  μž…λ ₯λ°›λŠ” ν•¨μˆ˜ """ print("?", s, idx) return int(input()) N = int(input()) A_Lidx = 1 A_Ridx = N # [A_Lidx ~ A_Ridx] 에 μ •λ‹΅ 후보가 있음 B_Lidx = 1 B_Ridx = N # [B_Lidx ~ B_Ridx] 에 μ •λ‹΅ 후보가 있음 while A_Ridx > A_Lidx: A_mid = (A_Lidx + A_Ridx) // 2 B_mid = (B_Lidx + B_Ridx) // 2 A_ret = Query("A", A_mid) B_ret = Query("B", B_mid) if A_ret <= B_ret: A_Lidx = A_mid + 1 B_Ridx = B_mid else: A_Ridx = A_mid B_Lidx = B_mid + 1 A_ret = Query("A", A_Lidx) B_ret = Query("B", B_Lidx) print("!", min(A_ret, B_ret)) πŸ”’ κ΅¬ν˜„ μ½”λ“œ 잠금