프로그래머스/[코테]Level2
[Python] 다리를 지나는 트럭
숨겨진 오징어
2020. 10. 22. 21:26
1) list로 해결
def solution(bridge_length, weight, truck_weights):
t = 0 # 트럭의 탑승시점
passing = [] # 다리 위의 트럭 리스트
pass_time = [] # 각 트럭들의 탑승시점 리스트
while truck_weights:
if t != 0 and pass_time[0]+bridge_length==t: # 타임0일 때에는 리스트 원소가 없음 and 탑승시점+다리길이=내릴 시점
passing.pop(0)
pass_time.pop(0) # 트럭이 다리를 빠져나갈 때, 해당 트럭의 t도 pop!
if truck_weights[0] + sum(passing) <= weight: # 다음 트럭을 합해도 무게제한을 넘지 않는다면 append
passing.append(truck_weights.pop(0)) # pop 메소드 후 바로 append
pass_time.append(t)
t += 1
return t+bridge_length
=> 적용 결과, 시간이 가장 많이 소요된 테스트케이스는
테스트 5 〉 | 통과 (83.42ms, 10.2MB) |
2) 이차원 리스트
def solution(bridge_length, weight, truck_weights):
t, on_board = 0, [] # 경과시간, 다리 위에 있는 트럭들
while truck_weights: # 더 이상 탑승대기 트럭이 없으면 break
t+=1
if sum([i for i,j in on_board])+sum(truck_weights[:1]) <= weight: # 다음 트럭이 타도 무게를 넘지 않는다면
on_board.append([truck_weights.pop(0),t]) # [트럭의 무게, 트럭이 탄 시점 t] append
if truck_weights==[]: # 더 이상 탑승대기 트럭이 없으면 break
break
if on_board[0][1]+bridge_length==t+1: # 맨 왼쪽의 트럭이 내릴 시간이 되었으면 pop(0)
on_board.pop(0)
answer = bridge_length + on_board[len(on_board)-1:][0][1]
return answer
=> 적용 결과, 시간이 가장 많이 소요된 테스트케이스는
테스트 5 〉 | 통과 (273.30ms, 10.2MB) |
3) deque 활용
from queue import deque
def solution(bridge_length, weight, truck_weights):
truck_weights, passing, time = deque(truck_weights), deque(), 0
while True:
if time==0: # 시작할 때, 대기트럭 하나를 passing에 추가
passing.append([time,truck_weights.popleft()])
time+=1
else: # time=1 이후부터 다음과 같이 진행
if len(truck_weights)==0: # 더이상 대기트럭이 없다면 time 계산후 종료
time += bridge_length
break
if passing[0][0]+bridge_length==time: # passing의 1번째가 내릴 타이밍인지 확인 후 제거
passing.popleft()
if sum(j for i,j in passing)+truck_weights[0]<=weight: # 트럭 추가가능한지 확인
passing.append([time,truck_weights.popleft()])
time+=1
return time
=> 적용 결과, 시간이 가장 많이 소요된 테스트케이스는
테스트 5 〉 | 통과 (289.55ms, 10.4MB) |