๐ ๋ฌธ์ ๋ถ์ํ๊ธฐ
- ๊ธธ์ด w(1 ≤ w ≤ 100) ๋จ์๊ธธ์ด์ ๋ค๋ฆฌ ์๋ฅผ n(1 ≤ n ≤ 1,000)๊ฐ์ ํธ๋ญ์ด ๊ฑด๋๊ฐ๊ณ ์ ํจ
- ๋ค๋ฆฌ ์์๋ w๋์ ํธ๋ญ๋ง ๋์์ ์ฌ๋ผ๊ฐ ์ ์์
- ๊ฐ ํธ๋ญ์ ํ๋์ ๋จ์์๊ฐ ๋์ ํ๋์ ๋จ์๊ธธ์ด ๋งํผ ์ด๋ ๊ฐ๋ฅ
- ๋ค๋ฆฌ ์ ํธ๋ญ๋ค์ ๋ฌด๊ฒ ํฉ ≤ ๋ค๋ฆฌ ์ต๋ํ์ค L(10 ≤ L ≤ 1,000)์ ๋ง์กฑํด์ผ ํจ
- ๋ค๋ฆฌ ์์ ์์ ํ ์ฌ๋ผ์ง ๋ชปํ ํธ๋ญ์ ๋ฌด๊ฒ ๊ณ์ฐ ์ ํฌํจํ์ง ์์
- ๋ชจ๋ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ์ต๋จ ์๊ฐ ๊ตฌํ๊ธฐ
๊ฐ์ฅ ๋จผ์ ๋ค๋ฆฌ ์์ ์ฌ๋ผ๊ฐ ํธ๋ญ์ด ๋จผ์ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ฒ ๋๋ฏ๋ก, ํ(Queue) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํธ๋ญ์ด ๋ค์ด๊ฐ์ง ์์ ๊ณต๊ฐ์๋ 0์ ๋ฃ์ด ํ์ ์์ ๊ฐ์๋ฅผ ๋ค๋ฆฌ์ ๊ธธ์ด์ธ w๋งํผ ์ ์ง์ํค๋ฉด์, ํ์ ๋ค์ด๊ฐ ํธ๋ญ์ ๋ฌด๊ฒํฉ์ด L์ ๋์ด๊ฐ์ง ์๋๋ก ๋ค์ ํธ๋ญ์ ํ์ ๋ฃ๊ณ , ํ์นธ์ฉ ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
ํ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋๋ ๋งจ์, ๋งจ๋ค ์์์ ์ฝ์ /์ญ์ ์ฐ์ฐ๋ง ์ผ์ด๋๋ฏ๋ก collections.deque๋ฅผ ์ฌ์ฉํ๋ค๋ฉด O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, n๊ฐ์ ํธ๋ญ์ด ๊ฐ๊ฐ w๊ธธ์ด์ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ผ ํ๋ฏ๋ก ์ด O(n+w)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ํ์ ๋ค์ด๊ฐ ํธ๋ญ์ ๋ฌด๊ฒํฉ์ ๋งค๋ฒ ๊ณ์ฐํ๊ฒ ๋ ๊ฒฝ์ฐ O(w)์ ์๊ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ์์๋๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(w)*O(n+w)๊ฐ ๋๋๋ฐ, ๋ณ๋์ ํ์ ๋ค์ด๊ฐ ํธ๋ญ์ ๋ฌด๊ฒ ํฉ ๋ณ์๋ฅผ ๋์ด ์ฝ์ , ์ญ์ ์ฐ์ฐ์ด ์ผ์ด๋ ๋ ๊ฐฑ์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ํธ๋ญ์ ์(n), ๋ค๋ฆฌ์ ๊ธธ์ด(w), ๋ค๋ฆฌ์ ์ต๋ํ์ค(L) ์ ๋ ฅ๋ฐ๊ธฐ
- ํธ๋ญ๋ค์ ๋ฌด๊ฒ ์ ๋ณด(trucks) ์ ๋ ฅ๋ฐ์ ํํํ๋ก ๋ณํ
- ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ณ์ฐํ ๋ณ์(time) ์ด๊ธฐํ
- ๋ค๋ฆฌ์ ํ์ฌ ํ์ค์ ๊ณ์ฐํ ๋ณ์(bridge_weight) ์ด๊ธฐํ
- ๋ค๋ฆฌ์ ํ์ฌ ์ํฉ์ ๋ํ๋ผ ํ(bridge) ์ด๊ธฐํ
- truck ํ์ ํธ๋ญ์ด ๋จ์์๊ฑฐ๋, ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ํธ๋ญ์ด ์๋ ๋์ ํธ๋ญ ์ด๋์ํค๊ธฐ
- ๊ฐ์ฅ ๋จผ์ bridge ํ์ ๋งจ ์ ์์๋ฅผ ์ ๊ฑฐํ์ฌ ํ์ฌ ๋ค๋ฆฌ ์์ ์๋ ํธ๋ญ์ ํ์นธ์ฉ ์ด๋
- ์์ง ๋ค๋ฆฌ ์์ ์ฌ๋ผ์ค์ง ์์ ํธ๋ญ์ด ์๋ค๋ฉด(= trucks ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด)
- ๋ค๋ฆฌ์ ํ์ฌ ํ์ค๊ณผ ๋ค์์ผ๋ก ์ฌ๋ผ๊ฐ ํธ๋ญ ๋ฌด๊ฒ์ ํฉ์ด L์ ๋์ง ์๋๋ค๋ฉด trucks ํ์ ๋งจ ์ ์์๋ฅผ popํด์ bridge ํ์ push
- ๊ทธ๋ ์ง ์๋ค๋ฉด(= ๋ค์ ํธ๋ญ์ ๋ค๋ฆฌ ์์ ์ฌ๋ฆด ์ ์๋ค๋ฉด) bridge์ 0 ์ฝ์
- time ๋ณ์์ 1 ๋ํ๊ธฐ
- truck ํ๊ฐ ๋น๊ณ , ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ํธ๋ญ์ ๋ฌด๊ฒ๊ฐ 0์ด ๋๋ฉด, ์ด ์์์๊ฐ ์ถ๋ ฅ
๐ ์ ๋ต ์ฝ๋
from collections import deque
n, w, L = map(int, input().split())
trucks = deque(map(int, input().split()))
time = 0
bridge = deque([0]*w)
bridge_weight = 0
while trucks or bridge_weight:
bridge_weight -= bridge.popleft()
if trucks:
if trucks[0] + bridge_weight <= L:
truck = trucks.popleft()
bridge.append(truck)
bridge_weight += truck
else:
bridge.append(0)
time += 1
print(time)