문제: https://www.acmicpc.net/problem/13335
구현문제라 문제에서 요구하는 사항들만 제대로 넣어주면 제대로 동작한다.
나는 다리에 올라가기 전의 트럭(truck), 다리 위의 트럭(bridge), 다 건넌 트럭(done)을 각각 만들어 풀었다. (사실 done은 없어도 된다.
그리고 트럭은 앞 차부터 빠져나가기 때문에 리스트에서 빼기 쉽게 queue를 활용해 풀이했다.
from collections import deque
# n: 트럭 수, w: 다리 길이, l: 다리 최대 하중
n, w, l = map(int, input().split())
truck = deque(list(map(int, input().split())))
bridge = deque()
done = []
time = 0
weight = 0
while truck or bridge:
time += 1
# 다리위의 트럭 한칸씩 옮기기
for i in range(len(bridge)):
bridge[i][1] += 1
# 다 건넌 트럭 done으로 옮기기
if bridge and bridge[0][1] > w:
weight -= bridge[0][0]
done.append(bridge.popleft())
# 트럭 다리위에 올리기
if truck and weight + truck[0] <= l:
weight += truck[0]
bridge.append([truck.popleft(), 1])
print(time)
처음에는 다 건넌 트럭을 done으로 옮기는 코드를 다리위의 트럭 한칸씩 옮기는 for 문 내에 넣어 돌렸는데, 이렇게 풀면 index error가 발생한다.
왜냐하면 다 건넌 트럭을 bridge에서 빼고 나면 마지막 i 변수에 해당하는 index가 사라지기 때문이다.
조금만 더 생각해보면 트럭이 1초마다 1만큼씩만 움직이기 때문에 한번에 트럭 1대만 done으로 옮겨갈 수 있다는걸 알 수 있다.
따라서 for문에서 따로 빼서 첫 트럭만 매번 검사해주도록 수정하였다.
'코딩테스트' 카테고리의 다른 글
[Python] 백준 1700번 - 멀티탭 스케줄링 (0) | 2023.06.01 |
---|---|
[Python] 백준 1012번 - 유기농 배추 (0) | 2023.05.31 |
[Python] 백준 1987번 - 알파벳 (0) | 2023.05.04 |
[Python] 백준 9205번 - 맥주 마시면서 걸어가기 (0) | 2023.05.01 |
[Python] 백준 10610번 - 30 (0) | 2022.07.29 |