ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1072 κ²Œμž„ with Python
    PS 2023. 4. 7. 15:18
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1072 κ²Œμž„

    πŸ’‘ 쑰건

    1. ν˜•νƒμ΄λŠ” μž μ‹œ 코딩을 ν•˜λŠ” 사이에 μžμ‹ μ˜ κ²Œμž„ μ‹€λ ₯이 λˆˆμ— λ„κ²Œ ν–₯μƒλœ 것을 μ•Œμ•˜λ‹€.
    1. ν˜•νƒμ΄λŠ” μ•žμœΌλ‘œμ˜ λͺ¨λ“  κ²Œμž„μ—μ„œ 지지 μ•ŠλŠ”λ‹€.
      ν˜•νƒμ΄λŠ” κ²Œμž„ 기둝을 μ‚­μ œ ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, μžμ‹ μ˜ μ˜ˆμ „ 기둝이 ν˜„μž¬ μžμ‹ μ˜ μ—„μ²­λ‚œ μ‹€λ ₯을 증λͺ…ν•˜μ§€ λͺ»ν•œλ‹€κ³  μƒκ°ν–ˆλ‹€.
    1. κ²Œμž„ 기둝은 λ‹€μŒκ³Ό 같이 생겼닀.
      • κ²Œμž„ 횟수 : X
      • 이긴 κ²Œμž„ : Y (Z%)
      • ZλŠ” ν˜•νƒμ΄μ˜ 승λ₯ μ΄κ³ , μ†Œμˆ˜μ μ€ 버린닀. 예λ₯Ό λ“€μ–΄, X=53, Y=47이라면, Z=88이닀.
    1. X와 Yκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, ν˜•νƒμ΄κ°€ κ²Œμž„μ„ μ΅œμ†Œ λͺ‡ 번 더 ν•΄μ•Ό Zκ°€ λ³€ν•˜λŠ”μ§€ κ΅¬ν•˜λŠ” 문제
      첫째 쀄에 ν˜•νƒμ΄κ°€ κ²Œμž„μ„ μ΅œμ†Œ λͺ‡ 판 더 ν•΄μ•Όν•˜λŠ”μ§€ 좜λ ₯ν•œλ‹€. λ§Œμ•½ Zκ°€ μ ˆλŒ€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ -1을 좜λ ₯ν•œλ‹€.
    1. 1 ≀ X ≀ 1,000,000,000
      0 ≀ Y ≀ X
    1. μˆ˜ν•™, 이뢄탐색 μœ ν˜•μ˜ 문제

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제 1

    10 8

    μ‹€ν–‰κ²°κ³Ό 1

    1

    예제 2

    100 80

    μ‹€ν–‰κ²°κ³Ό 2

    6

    예제 3

    47 47

    μ‹€ν–‰κ²°κ³Ό 3

    -1

    예제 4

    99000 0

    μ‹€ν–‰κ²°κ³Ό 4

    1000

    예제 5

    1000000000 470000000

    μ‹€ν–‰κ²°κ³Ό 5

    19230770

    ⌨️ 문제 풀이

    1. κ²Œμž„μ„ λͺ‡ νŒμ„ ν•˜λ©΄ 승λ₯ μ΄ 변할지 κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

    2. X의 λ²”μœ„λ₯Ό 보면 ν•˜λ‚˜ν•˜λ‚˜ κ³„μ‚°ν•΄μ„œ 찾을 수 μ—†κ³ , 이뢄탐색을 ν†΅ν•΄μ„œ κ²°κ³Όλ₯Ό λ„μΆœν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

    3. λ˜ν•œ 승λ₯ μ„ κ΅¬ν•˜λ €λ©΄ λ‹Ήμ—°νžˆ μ†Œμˆ«μ  계산이 ν•„μš”ν•˜λ‹€κ³  생각할 수 μžˆμ§€λ§Œ, b 에 100을 κ³±ν•˜λ©΄ κ·Έλ ‡κ²Œ ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

    4. 이뢄탐색을 처음 μ‹œμž‘ν•  λ•Œ, left 에 ν•΄λ‹Ήλ˜λŠ” λ³€μˆ˜λŠ” 0으둜 μ‹œμž‘ν•˜κ³  right 에 ν•΄λ‹Ήλ˜λŠ” λ³€μˆ˜λŠ” X, Y 쀑 큰 것을 골라 λ„£λŠ”λ‹€.

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    
    a, b = map(int, stdin.readline().split())
    z = b * 100 // a
    
    ans = int(1e11)
    start, end = 0, max(a, b)
    
    while start <= end:
        mid = (start + end) // 2
        res = (b + mid)  * 100 // (a + mid)
    
        if res != z:
            ans = min(ans, mid)
            end = mid - 1
        else:
            start = mid + 1
    
    print(ans if ans != int(1e11) else -1)
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.