ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 2512 μ˜ˆμ‚° with Python
    PS 2022. 6. 10. 16:11
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 2512 μ˜ˆμ‚°

    πŸ’‘ 쑰건

    1. κ΅­κ°€μ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ μ‹¬μ‚¬ν•˜μ—¬ κ΅­κ°€μ˜ μ˜ˆμ‚°μ„ λΆ„λ°°ν•˜λŠ” 것이닀.
      κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑은 미리 μ •ν•΄μ Έ μžˆμ–΄μ„œ λͺ¨λ“  μ˜ˆμ‚°μš”μ²­μ„ λ°°μ •ν•΄ μ£ΌκΈ°λŠ” μ–΄λ €μšΈ μˆ˜λ„ μžˆλ‹€.
      κ·Έλž˜μ„œ 정해진 총앑 μ΄ν•˜μ—μ„œ κ°€λŠ₯ν•œ ν•œ μ΅œλŒ€μ˜ 총 μ˜ˆμ‚°μ„ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ°°μ •ν•œλ‹€.
      1. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μžˆλŠ” κ²½μš°μ—λŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€.
      2. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ—λŠ” νŠΉμ •ν•œ μ •μˆ˜ μƒν•œμ•‘μ„ κ³„μ‚°ν•˜μ—¬ κ·Έ 이상인 μ˜ˆμ‚°μš”μ²­μ—λŠ” λͺ¨λ‘ μƒν•œμ•‘μ„ λ°°μ •ν•œλ‹€.
      3. μƒν•œμ•‘ μ΄ν•˜μ˜ μ˜ˆμ‚°μš”μ²­μ— λŒ€ν•΄μ„œλŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€.
    1. μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­κ³Ό κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μ˜ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ„λ‘ μ˜ˆμ‚°μ„ λ°°μ •ν•˜λŠ” 문제.
    1. 첫째 μ€„μ—λŠ” μ§€λ°©μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” μ •μˆ˜ N이 주어진닀. N은 3 이상 10,000 μ΄ν•˜μ΄λ‹€.
    1. λ‹€μŒ μ€„μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ ν‘œν˜„ν•˜λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 주어진닀. 이 값듀은 λͺ¨λ‘ 1 이상 100,000 μ΄ν•˜μ΄λ‹€.
    1. κ·Έ λ‹€μŒ μ€„μ—λŠ” 총 μ˜ˆμ‚°μ„ λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ M이 주어진닀. M은 N 이상 1,000,000,000 μ΄ν•˜μ΄λ‹€.
    1. 이뢄탐색 μœ ν˜•μ˜ 문제

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

    from sys import stdin
    
    n = int(stdin.readline())
    arr = list(map(int, stdin.readline().split()))
    m = int(stdin.readline())
    start, end = 0, max(arr)
    ans = -int(1e9)
    
    while start <= end:
        mid = (start + end) // 2
    
        total = 0
        for i in arr:
            total += min(i, mid)
    
        if total > m:
            end = mid - 1
        else:
            start = mid + 1
            ans = max(ans, mid)
    
    print(ans)

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

    예제

    4
    120 110 140 150
    485

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

    127

    ⌨️ 문제 풀이

    1. 총 μ˜ˆμ‚°μ„ λ‚˜νƒ€λ‚΄λŠ” M이 N 이상 1,000,000,000 μ΄ν•˜μ΄λ‹€.
      이 큰 값을 NλΆ€ν„° νƒμƒ‰ν•˜λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ 걸리기 λ•Œλ¬Έμ— 이뢄탐색을 μ‚¬μš©ν•΄ μ΄μ˜ˆμ‚°μ—μ„œ μƒν•œμ•‘μ„ μ°Ύμ•„μ£Όλ©΄ λœλ‹€.
    1. μš”μ²­ν•œ μ˜ˆμ‚°λ“€μ„ 담은 arr 리슀트의 max 값을 r, 0을 l둜 두고 이뢄탐색을 μ§„ν–‰ν•œλ‹€.
    1. (l + r) // 2 값을 mid 둜 두고 arr 리슀트λ₯Ό μˆœνšŒν•˜λ©΄μ„œ mid κ°’κ³Ό μˆœνšŒν•˜λŠ” 값을 비ꡐ해 μž‘μ€ 값을 total 에 λ„£μ–΄μ€€λ‹€.
    1. total 이 m 값보닀 클 λ•ŒλŠ” r을 mid둜 땑겨주고, κ·Έ μ™Έμ˜ 상황일 λ•ŒλŠ” ans의 κ°’κ³Ό λΉ„κ΅ν•΄μ„œ 큰 값을 ans 에 μ €μž₯ν•œλ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.