Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 2일차 TIL / 이뢄 탐색

geum 2024. 10. 29. 21:53

✏️ 문제

https://www.acmicpc.net/problem/11561

 

μŠΉνƒμ΄λŠ” 강을 κ±΄λ„ˆλ € ν•œλ‹€.

μŠΉνƒμ΄λŠ” μˆ˜μ˜μ„ λͺ»ν•˜κΈ° λ•Œλ¬Έμ—, 강에 놓인 징검닀리λ₯Ό 밟고 κ±΄λ„ˆκ°ˆ 것이닀.

μŠΉνƒμ΄λŠ” μˆ˜μ˜μ€ λͺ»ν•˜μ§€λ§Œ μ œμžλ¦¬λ›°κΈ°λŠ” 정말 μž˜ν•œλ‹€. μ›ν•˜λŠ” μ–΄λŠ κ³³μœΌλ‘œλ“ μ§€ μ ν”„ν•΄μ„œ λ°”λ‘œ 갈 μˆ˜κ°€ μžˆλ‹€.

μŠΉνƒμ΄λŠ” 이제 κ°•μ˜ ν•œμͺ½ λ³€ μ•žμ— μ„œ μžˆλ‹€.

κ°•μ—” 1λ²ˆλΆ€ν„° μ‹œμž‘ν•΄ 2번, 3번, ... , N번 징검닀리가 μ°¨λ‘€λŒ€λ‘œ 놓여 μžˆλ‹€.

κ°•μ˜ 폭이 넓은 탓에 μ§•κ²€λ‹€λ¦¬μ˜ μˆ˜λŠ” μ—„μ²­λ‚˜κ²Œ λ§Žλ‹€.

이 징검닀리λ₯Ό λͺ¨λ‘ 밟고 μ‹Άμ§€λŠ” μ•Šμ•˜λ˜ μŠΉνƒμ΄λŠ” μ œμžλ¦¬λ›°κΈ° μ‹€λ ₯을 λ°œνœ˜ν•΄ μ μ ˆν•œ 개수의 μ§•κ²€λ‹€λ¦¬λ§Œμ„ 밟고 κ°€κΈ°λ‘œ ν–ˆλ‹€.

λ¬Όλ‘  κ°• κ±΄λ„ˆνŽΈμœΌλ‘œ λ°”λ‘œ μ ν”„ν•˜λŠ” 것도 κ°€λŠ₯ν•˜μ§€λ§Œ, 더 재미있게 강을 κ±΄λ„ˆκΈ° μœ„ν•΄ μŠΉνƒμ΄λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ μ •ν–ˆλ‹€.

 

  1. 첫 μ§•κ²€λ‹€λ¦¬λŠ” μ ν”„ν•΄μ„œ 아무 κ²ƒμ΄λ‚˜ λ°Ÿμ„ 수 μžˆλ‹€. 이 점프가 첫 점프이닀.
  2. 두 번째 μ ν”„λΆ€ν„°λŠ” 이전에 μ ν”„ν•œ 거리보닀 1 이상 더 κΈ΄ 거리λ₯Ό λ›°μ–΄μ•Όλ§Œ ν•œλ‹€.
  3. N번 μ§•κ²€λ‹€λ¦¬λŠ” λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€.
  4. N번 징검닀리λ₯Ό λ°Ÿμ€ ν›„ κ°• κ±΄λ„ˆλ‘œ 이동할 땐 점프λ₯Ό ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μœ„μ˜ κ·œμΉ™μ΄ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

 

μŠΉνƒμ΄κ°€ μœ„μ˜ κ·œμΉ™μ„ 지킀며 강을 건널 λ•Œ, λ°Ÿμ„ 수 μžˆλŠ” μ§•κ²€λ‹€λ¦¬μ˜ μ΅œλŒ€ μˆ˜λŠ” λͺ‡ 개일까?

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: solved.ac κΈ°μ€€ S3

βœ… μ†Œμš” μ‹œκ°„: 1μ‹œκ°„ 50λΆ„

βœ… ꢌμž₯ μ‹œκ°„: 45λΆ„

 

πŸ’‘ 풀이

1) 문제 μœ ν˜• νŒŒμ•…

μ–΄μ œ κ²°μ‹¬ν•œλŒ€λ‘œ 문제λ₯Ό 보고 λ‚˜μ„œ 10λΆ„ λ™μ•ˆ 문제 μœ ν˜•μ— λŒ€ν•΄ κ³ λ―Όν–ˆλ‹€.

 

μ²˜μŒμ—λŠ” μž…μΆœλ ₯ ν˜•μ‹μ΄ λ­”κ°€ DPμŠ€λŸ½λ‹€κ³  μƒκ°ν–ˆλŠ”λ° 아무리 DP둜 풀어도 10^16 λ²”μœ„λ₯Ό μ²˜λ¦¬ν•  μˆ˜κ°€ μžˆλ‚˜? μ‹Άμ—ˆλ‹€. ν•˜μ§€λ§Œ μ•„μ‰½κ²Œλ„ μ—¬κΈ°μ„œ 이뢄 탐색을 μ¨μ•Όκ² λ‹€λŠ” μƒκ°μœΌλ‘œ μ΄μ–΄μ§€μ§€λŠ” λͺ»ν–ˆκ³ , 그럼 뭐 써야 ν•˜μ§€? ν•˜λŠ” 쀑에 10뢄이 μ΄ˆκ³Όν•΄μ„œ μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜λ₯Ό 톡해 μ•„ 이뢄 νƒμƒ‰μ΄κ΅¬λ‚˜ ν•˜λŠ” κ±Έ μ•Œκ²Œ 됐닀.

 

2) 아이디어 흐름

β‘  ⭐핡심 (1)⭐

'μ–΄λ–»κ²Œ ν•΄μ•Ό 징검닀리λ₯Ό μ΅œλŒ€λ‘œ λ°Ÿμ„ 수 μžˆμ„κΉŒ?'λΌλŠ” μ˜λ¬Έμ— λŒ€ν•΄ λ‚΄κ°€ λ‚΄λ¦° 결둠은 'μ‘°κΈˆμ”©λ§Œ μ ν”„ν•˜λŠ” 것'이닀.

 

λ¬Έμ œμ— 적힌 ν‘œν˜„μ„ ν™œμš©ν•΄ λ‹€μ‹œ μ μ–΄λ³΄μžλ©΄ '이전에 μ ν”„ν•œ 거리보닀 λ”± 1만큼만 더 길게 점프'ν•΄μ•Όλ§Œ λ°ŸλŠ” 징검닀리 수λ₯Ό μ΅œλŒ€λ‘œ λ§Œλ“€ 수 μžˆλ‹€.

 

β‘‘ ⭐핡심 (2)⭐

이뢄 탐색 λ¬Έμ œλŠ” start, end λ²”μœ„λ₯Ό μ‘°μ ˆν•˜κΈ° μœ„ν•œ 쑰건이 ν•„μš”ν•œλ° '점프 거리 λˆ„μ  ν•©' κ°œλ…κ³Ό 핡심 (1)의 λ‚΄μš©μ„ 가지고 이 λ¬Έμ œμ—μ„œ ν•„μš”ν•œ 쑰건을 λ„μΆœν•  수 μžˆλ‹€.

점프 거리 λˆ„μ  ν•© = 첫 번째 점프 거리+두 번째 점프 거리+...+K번째 점프 거리

 

κ²°κ΅­ N번째 μ§•κ²€λ‹€λ¦¬λŠ” 무쑰건 λ°ŸμœΌλ©΄μ„œ μ΅œλŒ€ 징검닀리λ₯Ό λ°Ÿμ„ 수 μžˆλŠ” 점프 거리 λˆ„μ  합은 1λΆ€ν„° KκΉŒμ§€μ˜ μžμ—°μˆ˜ 합을 κ΅¬ν•˜λŠ” 것과 λ™μΌν•˜λ‹€. 1+2+3+...+KλŠ” $\frac{{(K*(K+1))}{2}$둜 ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.

 

β‘’ 1λΆ€ν„° KκΉŒμ§€μ˜ 합을 κ΅¬ν•˜λŠ” 식을 μ΄μš©ν•΄ start, end λ²”μœ„λ₯Ό μ‘°μ ˆν•  수 μžˆλ‹€.

 

$\frac{{(K*(K+1))}{2}$κ°€ N보닀 클 경우: μ ν”„ 거리 λˆ„μ  합이 징검닀리 κ°œμˆ˜λ³΄λ‹€ ν¬λ‹€λŠ” 것은 μ–΄λ–»κ²Œ 해도 N번째 징검닀리λ₯Ό λ°Ÿμ„ 수 μ—†λ‹€λŠ” 뜻이 λœλ‹€. 이런 κ²½μš°μ—λŠ” end = mid-1둜 κ°±μ‹ ν•΄ 더 μž‘μ€ λ²”μœ„λ₯Ό 탐색할 수 μžˆλ„λ‘ ν•œλ‹€.

 

$\frac{{(K*(K+1))}{2}$κ°€ N보닀 μž‘μ„ 경우:  이 λ•ŒλŠ” λ§ˆμ§€λ§‰ μ§•κ²€λ‹€λ¦¬μ—μ„œ κΈ΄ μ ν”„λ‘œ N번째 징검닀리λ₯Ό 무쑰건 λ°Ÿμ„ 수 있게 λœλ‹€. λ¬Έμ œμ—μ„œ μ›ν•˜λŠ” 건 μ΅œλŒ“κ°’μ΄κΈ° λ•Œλ¬Έμ— N보닀 값이 μž‘μ€ λ²”μœ„μ—μ„œ κ°€μž₯ 큰 Kλ₯Ό μ°ΎκΈ° μœ„ν•΄ start = mid+1둜 κ°±μ‹ ν•œλ‹€.

 

3) κ΅¬ν˜„

import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
    N = int(input())

    answer = 0
    
    # 1+2+3+...+(K-2)+(K-1)+K=K(K+1)//2
    start, end = 1, N
    
    max_stone = float("-inf")
    
    while start <= end:
        mid = (start+end)//2
        
        jump_distance = (mid*(mid+1))//2
        
        # 점프 거리 λˆ„μ ν•©μ΄ N보닀 크면 N번째 징검닀리λ₯Ό λͺ» 밟음
        if jump_distance > N:
            end = mid-1
        else:
            max_stone = max(max_stone, mid)
            start = mid+1
        
    print(max_stone)

 

4) μ–΄λ €μ› λ˜ 점/배운 점

🚨 μ–΄λ €μ› λ˜ 점

  • 점프 거리 λˆ„μ  합이 N보닀 클 λ•Œ, μž‘μ„ λ•Œμ˜ 의미λ₯Ό νŒŒμ•…ν•˜λŠ” 데에 μ‹œκ°„μ΄ 쑰금 κ±Έλ Έλ‹€.

❗ 배운 점

  • μž…μΆœλ ₯ λ²”μœ„κ°€ 말도 μ•ˆ 되게 클 λ•ŒλŠ” $O(log_{N})$의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–λŠ” 이뢄 탐색 기법을 μ–΄λ–»κ²Œ μ μš©ν•  수 μžˆμ„μ§€ κ³ λ―Όν•΄λ³΄μž!