문제
처음 작성한 코드
def solution(bridge_length, weight, truck_weights):
from collections import deque
answer = 0
truck_weights = deque(truck_weights)
on_bridge = []
bbb = []
seconds = [0]*len(truck_weights)
idx=0
while True:
if len(bbb) < bridge_length and sum([i[1] for i in bbb])+truck_weights[0] <=weight:
a = truck_weights.popleft()
on_bridge.append([idx, a, True])
bbb.append([idx,a])
idx +=1
if not len(truck_weights):
answer+= bridge_length+1
return answer
for i in on_bridge:
if i[2]==True:
seconds[i[0]]+=1
if seconds[i[0]]==bridge_length:
i[2] =False
bbb.remove([i[0],i[1]])
answer+=1
코드 리뷰 후
def solution(bridge_length, weight, truck_weights):
from collections import deque
answer = 0
on_bridge = deque([0]*bridge_length) # 큐를 이용하여 다리를 건너는 트럭을 나타낸다. (0으로 채우는 것은 그때의 트럭이 지나가지 않는다는 것)
truck_weights = deque(truck_weights)
sum_weight = 0 # sum(on_bridge)할 때 시간 초과가 나기 때문에 sum을 위한 변수
while truck_weights: # 대기 중인 트럭이 있을 때
answer+=1 # 1초의 시간
sum_weight-=on_bridge.popleft() # 다리를 끝까지 지나간 트럭 무게 빼주기
if sum_weight + truck_weights[0]<= weight: # 문제 상의 조건(대기 중인 트럭이 다리를 건널 수 있는가)
sum_weight += truck_weights[0] # 다리 위의 트럭 무게를 더한다.
on_bridge.append(truck_weights.popleft()) # 대기 중인 트럭을 다리 위의 트럭 리스트에 추가
else: # 다리를 건널 조건이 안되면
on_bridge.append(0) # 0으로 채운다. (트럭이 못지나가기 때문..)
# bridge_length를 더하는 이유는 대기 중인 마지막 트럭을 빼고 while문을 빠져나오기 때문에
# 그 트럭이 다리를 건너는 시간인 bridge_length를 더해주는 것
return answer+bridge_length
깨달은 점
1. 어떻게 저렇게 생각을 하지?. . . . 난 너무 복잡하게 생각했다.....
2. for문 돌릴 때, ( for i in a: ) 이렇게 해놓고 for 문안에서 a의 원소를 remove하거나 리스트 자체에 변화가 생기면 내 뜻대로 돌아가지 않는다는 사실을 알아냈다..... ㅡ.ㅡ 어려워
'Programmers' 카테고리의 다른 글
[프로그래머스] 네트워크 (0) | 2021.01.06 |
---|---|
[프로그래머스] 타겟 넘버 (0) | 2021.01.05 |
프린터 (0) | 2021.01.03 |
카펫 (0) | 2021.01.03 |
소수 찾기 (0) | 2021.01.03 |