문제: 44. 다리를 지나는 트럭
- 모든 트럭이 일차선 다리를 건너려면 최소 몇 초가 걸리는가
- 트럭은 1초에 1만큼 움직이며, 다리길이는 bridge_length, 무게는 weight까지 견딘다.
- 길이가 2이고, 10kg인 무게를 견디는 다리가 있다.
-
무게가 [7,4,5,6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 한다.
경과 시간 /다리를 지난 /트럭 다리를 건너는 /트럭 대기 트럭 0 [][] [7,4,5,6] 1~2 [][7] [4,5,6] 3 [7][4] [5,6] 4 [7][4,5] [6] 5 [7,4][5] [6] 6~7 [7,4,5][6] [] 8 [7,4,5,6][] []
따라서 8초가 된다.
- 제한 조건
- birdge_legnth는 1 이상 10000이하다.
- weight은 1이상 10000이하이다
- 모든 트럭의 무게는 1이상 weight이하다
접근 방안
- 순서대로 최단 시간 안에 다리를 건너야 하며, 그 다리 또한 일차선 다리이다.
- 즉 주어진 조건대로 문제를 수행하기만 하면 된다.
-
입력값은 다리길이, 다리가 견딜 수 있는 최대 하중, 트럭의 무게 3개가 주어진다.
- 쪼개서 생각해보자
- 다리를 지나고 있는 트럭의 배열 만들자
- Q) 언제 트럭이 이 배열 안으로 들어올 수 있을까 ?(다리로 출발이 가능할까?)
- ( 다리의 최대 하중 - 현재 지나고 있는 트럭 무게 ) > 대기트럭 [0]의 수(무게)
- Q) 경과 시간은 어떻게 계산해줄 수 있을까 ?
- while문을 돌면서, 대기 트럭이 none이 아니고, 다리를 건너는 트럭 배열이 none이 아닐 때까지 반복
- 변수를 하나 두고, 반복한 횟수를 센다.
- Q) 그렇다면 경과 시간이 2가 되었을 때, 출발한 자동차를 언제 pop을 해주지 ?
- 그걸 잘 모르겠다.
- 자동차와 경과시간을 튜플로 묶어서 저장한 뒤, 경과시간이 2인 것들만, 조건문을 통해서 빠져나가게 하면 되지 않을까?
- 이게 문제에서 의도하고 있는 접근이 아닌 것 같다..
다른 분들의 코드를 결국 참고했다
- 힌트만 가져와봤다.
- 다리의 길이만큼 q를 0으로 채운다. -> 이 생각을 전혀 못했다.
- 시간은 0초부터 시작
- 다리가 있는 동안 반복
- 매 루프마다 1초씩 더한다
- q의 맨 앞 값을 pop하는 이유는 트럭이 지나감을 표현하기 위해서다
- 트럭 배열이 있다면
- 다리에 있는 트럭 무게+대기 중인 트럭 무게<=한계 무게인 경우, 대기 중인 트럭을 다리에 싣는다.
- 다리의 하중 초과면 q에 0을 넣어서 트럭을 왼쪽으로 이동시킨다. - 트럭의 이동을 0을 넣어서 진행시킨다.
코드
def solution(bridge_length, weight, truck_weights):
q = [0] * bridge_length
sec = 0
while q:
sec += 1 # 시작했으니 1초를 더한다.
q.pop(0) # 시간의 경과에 따른 트럭의 이동
if(truck_weights):
if sum(q) + truck_weights[0] <= weight:
q.append(truck_weights.pop(0))
else:
q.append(0)
return sec
print(solution(2, 10, [7, 4, 5, 6]))
이것을 몰라서 구현을 못했다.
- 알면 정말 쉽고. 모르면 어렵다.
- q에 다리의 길이를 넣어서 초기화 시켜준 것
- 자동차의 이동을 0을 append하고 pop(0) 한 것으로 표시해준 것
- while 문의 조건절에 q를 넣은 것
참고자료 [참고블로그]https://oneshottenkill.tistory.com/340 [프로그래머스]https://programmers.co.kr/learn/challenges