[Python] S3_2512_์˜ˆ์‚ฐ ๐Ÿ’ฐ

Sangho Hanยท2023๋…„ 6์›” 13์ผ
post-thumbnail

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

๋ฌธ์ œ

๊ตญ๊ฐ€์˜ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๋Š” ์—ฌ๋Ÿฌ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ์š”์ฒญ์„ ์‹ฌ์‚ฌํ•˜์—ฌ ๊ตญ๊ฐ€์˜ ์˜ˆ์‚ฐ์„ ๋ถ„๋ฐฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ตญ๊ฐ€์˜ˆ์‚ฐ์˜ ์ด์•ก์€ ๋ฏธ๋ฆฌ ์ •ํ•ด์ ธ ์žˆ์–ด์„œ ๋ชจ๋“  ์˜ˆ์‚ฐ์š”์ฒญ์„ ๋ฐฐ์ •ํ•ด ์ฃผ๊ธฐ๋Š” ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ •ํ•ด์ง„ ์ด์•ก ์ดํ•˜์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ๋Œ€์˜ ์ด ์˜ˆ์‚ฐ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐ์ •ํ•œ๋‹ค.

  1. ๋ชจ๋“  ์š”์ฒญ์ด ๋ฐฐ์ •๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์š”์ฒญํ•œ ๊ธˆ์•ก์„ ๊ทธ๋Œ€๋กœ ๋ฐฐ์ •ํ•œ๋‹ค.

  2. ๋ชจ๋“  ์š”์ฒญ์ด ๋ฐฐ์ •๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠน์ •ํ•œ ์ •์ˆ˜ ์ƒํ•œ์•ก์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ทธ ์ด์ƒ์ธ ์˜ˆ์‚ฐ์š”์ฒญ์—๋Š” ๋ชจ๋‘ ์ƒํ•œ์•ก์„ ๋ฐฐ์ •ํ•œ๋‹ค. ์ƒํ•œ์•ก ์ดํ•˜์˜ ์˜ˆ์‚ฐ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์š”์ฒญํ•œ ๊ธˆ์•ก์„ ๊ทธ๋Œ€๋กœ ๋ฐฐ์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ฒด ๊ตญ๊ฐ€์˜ˆ์‚ฐ์ด 485์ด๊ณ  4๊ฐœ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ์š”์ฒญ์ด ๊ฐ๊ฐ 120, 110, 140, 150์ด๋ผ๊ณ  ํ•˜์ž. ์ด ๊ฒฝ์šฐ, ์ƒํ•œ์•ก์„ 127๋กœ ์žก์œผ๋ฉด, ์œ„์˜ ์š”์ฒญ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ 120, 110, 127, 127์„ ๋ฐฐ์ •ํ•˜๊ณ  ๊ทธ ํ•ฉ์ด 484๋กœ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ€ ๋œ๋‹ค.

์—ฌ๋Ÿฌ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ์š”์ฒญ๊ณผ ๊ตญ๊ฐ€์˜ˆ์‚ฐ์˜ ์ด์•ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์œ„์˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋„๋ก ์˜ˆ์‚ฐ์„ ๋ฐฐ์ •ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ง€๋ฐฉ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 3 ์ด์ƒ 10,000 ์ดํ•˜์ด๋‹ค. ๋‹ค์Œ ์ค„์—๋Š” ๊ฐ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ์š”์ฒญ์„ ํ‘œํ˜„ํ•˜๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐ’๋“ค์€ ๋ชจ๋‘ 1 ์ด์ƒ 100,000 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ์ด ์˜ˆ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. M์€ N ์ด์ƒ 1,000,000,000 ์ดํ•˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ๋ฐฐ์ •๋œ ์˜ˆ์‚ฐ๋“ค ์ค‘ ์ตœ๋Œ“๊ฐ’์ธ ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ

์กฐ๊ฑด

  • ์‹œ๊ฐ„ ์ œํ•œ: 1์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 128MB

์ฝ”๋“œ

import sys
input = sys.stdin.readline

# ์ž…๋ ฅ
N = int(input())
demand = sorted(list(map(int,input().split()))) # ๊ฐ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ ์š”์ฒญ
budget = int(input())         # ์ด ์˜ˆ์‚ฐ
n_lst = range(1,demand[-1]+1) # ์ด๋ถ„ํƒ์ƒ‰์„ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ

# Binary Search
start,end = 0,len(n_lst)-1
while start <= end:
    mid = (start+end)//2 # ์ค‘๊ฐ„ ์ธ๋ฑ์Šค
    limit = n_lst[mid]   # ์ƒํ•œ์•ก ์„ค์ •
    Sum = 0              # ์ƒํ•œ์•ก์— ๋”ฐ๋ฅธ ํ•ฉ
    # ์˜ˆ์‚ฐ ์š”์ฒญ ํŒŒ์•…
    for num in demand: 
        if num < limit:
            Sum += num
        else:        
            Sum += limit
    # ์ค‘๊ฐ„ ์ธ๋ฑ์Šค ์žฌ์„ค์ •        
    if Sum < budget:
        start = (mid+1)
    elif Sum > budget:
        end = (mid-1)
    else:
        print(n_lst[mid])
        exit(0)

# ์ถœ๋ ฅ
if Sum > budget:  # ์ด ์˜ˆ์‚ฐ์„ ์ดˆ๊ณผํ–ˆ์„ ๊ฒฝ์šฐ        
    print(n_lst[mid-1])
else:
    print(n_lst[mid])
  1. ๊ฐ ์ง€๋ฐฉ์˜ ์˜ˆ์‚ฐ ์š”์ฒญ demand ๋ฅผ ์ž…๋ ฅ ๋ฐ›์€ ํ›„, ์ •๋ ฌํ•ด์ค€๋‹ค.
  1. ์ด๋ถ„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, range(1,demand[-1]+1) ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  1. ์ค‘๊ฐ„ ์ธ๋ฑ์Šค mid ์— ํ•ด๋‹นํ•˜๋Š” ์ƒํ•œ์•ก limit ์„ ํ†ตํ•ด์„œ ํ•ฉ Sum ์„ ๊ตฌํ•ด์ค€๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด demand ๊ฐ€ [110,120,140,150] ์ด๊ณ , limit ์ด 130์ด๋ผ๋ฉด, Sum ์€ 110 + 120 + 130 + 130 ์œผ๋กœ 490 ์ด ๋œ๋‹ค.

  • ํ˜„์žฌ Sum ์ด budget ์ธ 485 ๋ณด๋‹ค ํฌ๋ฏ€๋กœ, end ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.

  • ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๊ฐ€์žฅ budget ์— ๊ทผ์‚ฌํ•œ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

  1. Sum ์ด budget ๋ณด๋‹ค ํฐ ์ƒํƒœ๋กœ limit ๊ฐ’์ด ๊ตฌํ•ด์กŒ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ•ด์ค€๋‹ค.
  • ๋งŒ์•ฝ ์ดˆ๊ณผํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š”, n_lst[mid] ์ด ์•„๋‹Œ n_lst[mid-1] ์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

๋А๋‚€ ์  & ๋ฐฐ์šด ์ 

  1. ์ฒ˜์Œ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐ€์•ผํ• ์ง€ ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ, ๊ทผ์‚ฌ์น˜๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ์ ์—์„œ ์ด๋ถ„ํƒ์ƒ‰์„ ํ™œ์šฉํ•˜๊ธฐ๋กœ ํ•œ ์ ์ด ์ข‹์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

  2. ์ด์ œ ์™€์„œ ๋ณด๋‹ˆ ๊ตณ์ด ์ธ๋ฑ์‹ฑ์„ ์œ„ํ•ด mid ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , range(0,demand[-1]) ๋กœ ์„ค์ •ํ–ˆ์œผ๋ฉด ๋” ๋ณด๊ธฐ ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

profile
๋ธ”๋กœ๊ทธ ์ด๊ด€ํ•˜์˜€์Šต๋‹ˆ๋‹ค: https://bbbang105.github.io/

0๊ฐœ์˜ ๋Œ“๊ธ€