프로그래머스 코딩테스트의 다리를 지나는 트럭을 풀어보았다.
생각보다 애먹었다 ㅠㅠ
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/42583
코딩테스트 연습 - 다리를 지나는 트럭
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이��
programmers.co.kr
내가 제일 해맸던 부분이 트럭이 얼마만큼 다리를 지나갔는지 체크해야 하는 것인데 이 부분을 잘 못해서 고생했다.
쩃든 아래 내 코드를 한번 보자.
def solution(bridge_length, weight, truck_weights):
#기다리고 있는 트럭
waitTrucks = []
for truck in truck_weights:
waitTrucks.insert(0,truck)
#지나가고있는 트럭들.
goingTrucks = []
#시간결과리턴
answer = 0
#다리위에 올릴 수 있는지 체크하기위한 변수
waiting = 0
index=0
length = len(truck_weights)
while waitTrucks:
if len(goingTrucks) == bridge_length: #길이가 같다면 트럭이 다 지나갔기때문에 뺴주자.
waiting-=goingTrucks.pop()
nextTruck=waitTrucks.pop()
if weight >= waiting+nextTruck: #다리위에 트럭을 놓을 수 있는가 비교한다
#트럭을 다리위에 놓아준다
waiting+=nextTruck
goingTrucks.insert(0,nextTruck)
else:
#무게떄문에 트럭을 못놓는다면 시간만 지나간다.
goingTrucks.insert(0,0)
waitTrucks.append(nextTruck) #pop헀기떄문에트럭을 다시 대기열에 넣어줘야한다.
answer += 1
#대기열 트럭이 다 빠졌더라도 지나가고있는 트럭들의 시간도 세줘야 한다.
#bridge_length의 길이만큼 지나가야 하기 때문에 bridge_length의 길이를 더해준다.
if goingTrucks:
answer += bridge_length
return answer
여기서 중요한 점은
1. 무게 때문에 트럭이 못지나 가도 goingTruck에 값을 넣어주어서 트럭이 지나간걸 확인할 수 있게끔 한 것이고
2. goingTruck의 길이와 다리의 길이가 같다면 트럭이 지나간것이므로 트럭을 다리위에서 빼주는 것이다.
3. 그리고 큐(waitTruck)가 빌때까지 while은 돌리는데 while이 빠져나갔더라도 트럭이 다리위에 지나갈 수 있으므로
다리위에 트럭이 있는지 확인한후(goingTruck) 다리길이만큼 시간을 더해줘야 한다.
나두 다른분들 푼것을 조금 참조해서 풀었따.
'프로그래밍공부 > 알고리즘' 카테고리의 다른 글
코딩테스트 - K번째수 (0) | 2020.08.03 |
---|---|
코딩테스트 - 알고리즘 공부 - 베스트앨범 (2) | 2020.07.28 |
코딩테스트 - 위장 (0) | 2020.07.24 |
프로그래머스-전화번호 목록 풀이 (0) | 2020.07.22 |
완주하지 못한 선수 - 알고리즘 공부 (2) | 2020.07.21 |