๐ญ ๋ฌธ์ ์ดํด
ํธ๋ญ์ด ์์๋๋ก ๋๊ธฐํ๊ณ ์๊ณ ,
๋ค๋ฆฌ๊ฐ ๊ฒฌ๋ ์ ์๋ ๋ฌด๊ฒ ๋ด์์ ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ชจ๋ ํธ๋ญ์ด ํต๊ณผํ๋ ์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
ํธ๋ญ๋ค์ด ๋๊ธฐํ๋ค๊ฐ ์์๋๋ก ์ง๋๊ฐ๊ณ , ๋ค๋ฆฌ ๋ํ ํ ๋ฐฉํฅ์ผ๋ก ์ง๋๊ฐ๊ธฐ ๋๋ฌธ์ Queue๊ฐ ๋ ์ฌ๋๋ค.
ํธ๋ญ์ด ์ง๋๊ฐ๋ ๋ค๋ฆฌ๋ฅผ bridge๋ผ๋ ์ด๋ฆ์ผ๋ก queue(deque ์ฌ์ฉ)๋ฅผ ์ ์ธํ๊ณ
๋๊ธฐ ์ค์ธ ํธ๋ญ๋ค์ waiting์ด๋ผ๋ ์ด๋ฆ์ผ๋ก queue๋ฅผ ์ ์ธํ๋ค.
๋๋ต์ ์ธ ์ฝ๋ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
0. 0์ด๋ถํฐ 1์ด ์ฉ ์ฆ๊ฐํ๋ฉฐ ์๊ฐ์ ๊ธฐ๋กํ๋ค.
1. bridge๊ฐ ๋น์ด์์ง ์๋ค๋ฉด ์ง๊ธ ์์ ์ ์ง๋๊ฐ์ผํ๋ ํธ๋ญ์ dequeue ์ํจ๋ค. (๋ค๋ฆฌ๋ฅผ ๋น ์ ธ๋๊ฐ๋ค.)
2. bridge์ waiting์ ๋จ์ ํธ๋ญ์ด ์๋ค๋ฉด ํ์ฌ ์๊ฐ์ ๋ฆฌํดํจ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃ์ํจ๋ค. (๋ชจ๋ ์ฐจ๋์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ)
3. ๋๊ธฐ์ค์ธ ์ฐจ๋์ด ์กด์ฌํ๋ค๋ฉด ๋ค๋ฆฌ์ ์ด ๋ฌด๊ฒ๋ฅผ ์ฒดํฌํด๋ณด๊ณ ํ์ฌ ์์ ๊ธฐ๋ก๊ณผ ํจ๊ป bridge์ ์ง์ ์ํจ๋ค.
(tuple(๋ฌด๊ฒ, ์๊ฐ)์ bridge์ enqueue ์ํค๋ ๊ฒ)
๊ตฌํ ์ธ์ด: Python
from collections import deque
def solution(bridge_length, weight, truck_weights):
time = 0
weight_sum = 0
bridge, waiting = deque(), deque(truck_weights)
while True:
time += 1
# ์ฒดํฌํ๋ฉด์ ์ด๋ฒ ํ์์ ๋๊ฐ์ผํ ํธ๋ญ์ ๋ด๋ณด๋ธ๋ค.
if bridge: # ๋ค๋ฆฌ๊ฐ ๋น์ด์์ง ์์ ์ํ์ผ ๋
if time == bridge[0][1] + bridge_length:
weight_sum -= bridge[0][0]
bridge.popleft()
# ๋ชจ๋ ์ฐจ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ฉด ์ข
๋ฃ
if (not bridge) and (not waiting):
return time
# ๋ค๋ฆฌ๊ฐ ๊ฒฌ๋ ์ ์๋ ๋ฌด๊ฒ์ ํํ์ฌ ์ถ๊ฐํ ์ฐจ๋์ ์ถ๊ฐํ๋ค.
if waiting:
if weight_sum + waiting[0] <= weight:
bridge.append((waiting[0], time)) # ํ์ฌ ์์ ๊ธฐ๋ก๊ณผ ํจ๊ป ๋ค๋ฆฌ์ ์ง์
weight_sum += waiting[0] # ๋ค๋ฆฌ์ ์ด ๋ฌด๊ฒ ๊ฐฑ์
waiting.popleft() # ๋๊ธฐ์ด์์ ์ ๊ฑฐ
return time