Problem Solving/[ํ•ญํ•ด99] TIL

99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 6์ผ์ฐจ TIL / ์ด๋ถ„ ํƒ์ƒ‰

geum 2024. 11. 3. 10:46

โœ๏ธ ๋ฌธ์ œ

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

 

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

๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋จผ์ €, ์ƒ๊ทผ์ด๋Š” ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ†ฑ๋‚ ์ด ๋•…์œผ๋กœ๋ถ€ํ„ฐ H๋ฏธํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ทธ ๋‹ค์Œ, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๋ชจ๋‘ ์ ˆ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ, ๋†’์ด๊ฐ€ H๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋Š” H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋‚˜๋ฌด๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ 20, 15, 10, 17์ด๋ผ๊ณ  ํ•˜์ž. ์ƒ๊ทผ์ด๊ฐ€ ๋†’์ด๋ฅผ 15๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, ๋‚˜๋ฌด๋ฅผ ์ž๋ฅธ ๋’ค์˜ ๋†’์ด๋Š” 15, 15, 10, 15๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ƒ๊ทผ์ด๋Š” ๊ธธ์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด์™€ 2์ธ ๋‚˜๋ฌด๋ฅผ ๋“ค๊ณ  ์ง‘์— ๊ฐˆ ๊ฒƒ์ด๋‹ค. (์ด 7๋ฏธํ„ฐ๋ฅผ ์ง‘์— ๋“ค๊ณ  ๊ฐ„๋‹ค) ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋Š” ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ƒ๊ทผ์ด๋Š” ํ™˜๊ฒฝ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋ฌด๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

๐Ÿค– ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

 

๐Ÿง ๋‚œ์ด๋„/์†Œ์š” ์‹œ๊ฐ„

โœ… ๋‚œ์ด๋„: solved.ac ๊ธฐ์ค€ S2

โœ… ์†Œ์š” ์‹œ๊ฐ„: ์˜ˆ์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋ผ ์ธก์ • X

โœ… ๊ถŒ์žฅ ์‹œ๊ฐ„: 1์‹œ๊ฐ„

 

๐Ÿ’ก ํ’€์ด

1) ๋ฌธ์ œ ์œ ํ˜• ํŒŒ์•…

์ด๋ถ„ ํƒ์ƒ‰ ๋ฌธ์ œ๋‹ค. ์ด์ œ ์ด๋ถ„ ํƒ์ƒ‰ ๋ฌธ์ œ๋Š” ์œ ํ˜•์ด ์กฐ๊ธˆ ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„..!

 

์˜ˆ์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋ผ ์ด๋ฒˆ ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ํ’€์–ด๋ณด๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณต์Šตํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.

 

2) ์•„์ด๋””์–ด ํ๋ฆ„

โ‘  โญํ•ต์‹ฌ (1) - ๋ฒ”์œ„ ์„ค์ •โญ

์ด๋ถ„ ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋งˆ๋‹ค end ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€๊ฐ€ ๋งค๋ฒˆ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ์˜€๋‹ค. ์ด์ œ ์ด ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” end๋ฅผ ํ•ญ์ƒ max(์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ)๋กœ ์„ค์ •ํ•˜์ž! ๋ผ๋Š” ๋‚˜๋งŒ์˜ ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

โ‘ก โญํ•ต์‹ฌ (2) - ์ด๋ถ„ ํƒ์ƒ‰ ๋Œ€์ƒ ์„ค์ •โญ

๋‚ด๊ฐ€ ์˜ˆ์ „์— ์ œ์ถœํ•œ ์ •๋‹ต ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์ฒ˜์Œ ํ‘ธ๋Š” ์‚ฌ๋žŒ์˜ ์ž์„ธ๋กœ ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋‹ˆ ์Šคํ„ฐ๋”” 3์ผ์ฐจ ๋ฌธ์ œ์™€ ํ’€์ด ๋ฐฉ์‹์ด ๋น„์Šทํ•  ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค.

 

1๏ธโƒฃ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ž…๊ตญ์‹ฌ์‚ฌ:  ๋ˆ„์  ์ฒ˜๋ฆฌ ์ธ์›(์ด ๋•Œ mid ๊ฐ’์€ n๋ช… ์ด์ƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ์‹œ๊ฐ„)

 

๋‚˜๋ฌด ์ž๋ฅด๊ธฐ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋‚˜๋ฌด ๋ฆฌ์ŠคํŠธ = ์ž…๊ตญ์‹ฌ์‚ฌ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ time ๋ฆฌ์ŠคํŠธ

๋‚˜๋ฌด ์ž๋ฅด๊ธฐ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•  ์ด๋ถ„ ํƒ์ƒ‰ ๋Œ€์ƒ = ์ž…๊ตญ์‹ฌ์‚ฌ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•œ ๋ˆ„์  ์ฒ˜๋ฆฌ ์ธ์›

 

์ž…๊ตญ์‹ฌ์‚ฌ ๋ฌธ์ œ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์œ„์™€ ๊ฐ™์ด ๋งค์นญ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐํ–ˆ๊ณ  ์ด ๋ฌธ์ œ์—์„œ์˜ ์ด๋ถ„ ํƒ์ƒ‰ ๋Œ€์ƒ์€ ์ƒ๊ทผ์ด๊ฐ€ ์–ป์€ ๋‚˜๋ฌด ๊ธธ์ด์˜ ์ด ํ•ฉ์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

 

์ •๋ ฌ๋œ ๋‚˜๋ฌด ๋†’์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ฉด์„œ ์ƒ๊ทผ์ด๊ฐ€ ์–ป์€ ๋‚˜๋ฌด ๊ธธ์ด(get_wood)์— ํ˜„์žฌ ๋‚˜๋ฌด ๋†’์ด(tree)-์ ˆ๋‹จ๊ธฐ ๋†’์ด(mid)๋ฅผ ๊ณ„์† ๋”ํ•ด์ฃผ๋ฉด์„œ ์ƒ๊ทผ์ด๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์–ป์€ ๋‚˜๋ฌด ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

 

โ‘ข โญํ•ต์‹ฌ (3) - ํƒ์ƒ‰ ์กฐ๊ฑด ๊ฒ€์‚ฌโญ

โ‘ก๋ฒˆ ๊ณผ์ •์—์„œ ๊ณ„์‚ฐ์ด ๋๋‚œ get_wood ๊ฐ’์„ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ณ ์ž ํ•˜๋Š” ๊ธธ์ด M๊ณผ ๋น„๊ตํ•œ๋‹ค.

 

์ƒ๊ทผ์ด๊ฐ€ ์–ป์€ ๋‚˜๋ฌด ๊ธธ์ด ํ•ฉ์ด M๊ณผ ๊ฐ™๊ฑฐ๋‚˜ M๋ณด๋‹ค ํด ๊ฒฝ์šฐ: ํ˜„์žฌ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •๋œ ๋†’์ด๋กœ ์ƒ๊ทผ์ด๊ฐ€ ์›ํ•˜๋Š” ๊ธธ์ด ์ด์ƒ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ ˆ๋‹จ๊ธฐ ์„ค์ • ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ๊ฒŒ ๋ชฉํ‘œ๊ธฐ ๋•Œ๋ฌธ์— start = mid+1๋กœ ๊ฐฑ์‹ ํ•ด ์ ˆ๋‹จ๊ธฐ ์„ค์ • ๋†’์ด ๊ฐ’์„ ๋Š˜๋ ค ๊ฐ€๋ฉด์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„ ๋‚˜๊ฐ„๋‹ค.

 

์ƒ๊ทผ์ด๊ฐ€ ์–ป์€ ๋‚˜๋ฌด ๊ธธ์ด ํ•ฉ์ด M๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ: ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •๋œ ๋†’์ด๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์„œ ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์ž‘๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ end = mid-1๋กœ ๊ฐฑ์‹ ํ•ด ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ ๋‚ฎ์ถฐ์ค€๋‹ค. 

 

3) ๊ตฌํ˜„

import sys

input = sys.stdin.readline

N, M = map(int, input().split())

tree_height = list(map(int, input().split()))

tree_height.sort()

answer = 0

start, end = 1, tree_height[-1]

while start <= end:
    mid = (start+end)//2
    
    get_wood = 0

    for tree in tree_height:
        if tree >= mid:
            get_wood += tree-mid
        
        if get_wood >= M:
            break

    if get_wood >= M:
        answer = mid
        start = mid+1
    else:
        end = mid-1

print(answer)

 

4) ์–ด๋ ค์› ๋˜ ์ /๋ฐฐ์šด ์ 

๐Ÿšจ ์–ด๋ ค์› ๋˜ ์ 

  • ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ณ„์† ์ •๋‹ต ๊ฐ’์„ ์ฐพ์•„๋‚˜๊ฐˆ ๋•Œ min, max๋ฅผ ์ด์šฉํ•ด์„œ ํ˜„์žฌ ์ •๋‹ต ๊ฐ’๊ณผ mid ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์„ ์ผ๋Š”๋ฐ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ทธ ๋ฐฉ์‹์„ ์“ฐ๋‹ˆ๊นŒ ๊ณ„์† ํ‹€๋ ค์„œ ๋‹ต์„ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ์กฐ๊ธˆ ์–ด๋ ค์› ๋‹ค. ์ข€ ๋” ์ƒ๊ฐํ•ด๋ณด๊ณ  ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๋””์Šค์ฝ”๋“œ์— ์งˆ๋ฌธ ์˜ฌ๋ ค์•ผ์ง€ ๐Ÿ˜Ž

โ— ๋ฐฐ์šด ์ 

  • ์ •๋‹ต์„ ์ฐพ์•„๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์— ๊ณต์‹์ฒ˜๋Ÿผ ์ •ํ•ด์ง„ ๊ฑด ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ฐฉ๋ฒ•๋„ ์จ๋ณด๊ณ  ์ € ๋ฐฉ๋ฒ•๋„ ์จ๋ณด์ž(์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•œ๋‹ค๋Š” ์ „์ œ ํ•˜์—)