코딩테스트 연습 - 다리를 지나는 트럭
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈
programmers.co.kr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
from collections import deque
def solution(bridge_length, weight, truck_weights):
answer = 0
v = 0
tot = 0 # sum()을 사용하면 testcase5 에서 시간초과
bridge = [0] * bridge_length
q = deque(bridge)
trucks = deque(truck_weights)
while trucks:
# 트럭이 다리를 건넜을 경우 v 는 != 0
if v != 0:
if tot + trucks[0] <= weight:
q[0] = trucks.popleft()
tot += q[0]
while trucks and tot + trucks[0] <= weight:
new = trucks.popleft()
tot += new
q.appendleft(new)
l = q.pop()
tot -= l
answer += 1
v = q.pop()
q.appendleft(0)
tot -= v
answer += 1
# index = 도착지와 가장 멀리 떨어져 있는 트럭의 위치
# 그 트럭이 끝까지 가면 모든 트럭이 도착한 것이다.
for i, j in enumerate(q):
if j != 0:
index = i
break
plus = bridge_length - index
answer += plus
return answer
bridge_length = 2
weight = 10
truck_weights = [7, 4, 5, 6]
print(solution(bridge_length, weight, truck_weights))
|
cs |
1.
q.pop()이 일어날 때 마다 1초가 지나간다. 트럭이 추가되어도 무게가 초과되지 않고, 추가할 수 있는 트럭이 존재한다면 while문을 사용하여 가능한 무게까지 q.appendleft(새로운 트럭)을 사용한다. 만약 트럭이 추가될 수 없다면 q.appendleft(0)을 사용한다. q.pop()이 사용됐으면 answer += 1을 해주자
2.
처음 풀이에서는 tot를 사용하지 않고 sum()을 사용했는데, testcase5에서 시간초과가 발생했다. sum()은 O(N)의 시간복잡도를 가지므로 충분히 일어날 수 있다.
3.
v = q.pop()을 통해 얻은 v가 0이 아닐 경우 트럭이 다리를 완전히 건넌 경우이다. 두 가지의 특수한 상황을 고려해야 한다.
3-1.
answer = 5, q = deque([0, 0, 5, 4, 1])
answer = 6, q = deque([0, 0, 0, 5, 4])
answer = 6, q = deque([6, 0, 0, 5, 4])
도로에 6이 추가될 수 있는지 확인하고 가능하다면 q.pop() (answer += 1)없이 q[0]에 6을 추가했다. 이 이후에 트럭이 더 추가할 수 있는지는 아래의 while문에서 한번 더 확인할 것이다.
3-2.
q = deque([0, 0]) | ||
7 | 0 | pop 1번 |
0 | 7 | pop 2번 |
0 | 0 | pop 2번 |
4 | 0 | pop 3번 |
5 | 4 | pop 4번 |
0 | 5 | pop 5번 |
0 | 0 | pop 5번 |
6 | 0 | pop 6번 |
0 | 6 | pop 7번 |
7과 5가 다리를 건널 때, 다리는 [0, 0]으로 초기화 된다. 이 때, 바로 아래의 while문으로 들어간다면 q.pop()을 한번 더 하게 된다. 이 경우 q[0]에 새로운 트럭을 추가시키고 while문으로 내려가게 한다.
'알고리즘 문제풀이 with 파이썬 > 프로그래머스' 카테고리의 다른 글
[해시] 위장 (0) | 2021.10.04 |
---|---|
[스택] 주식 가격 (0) | 2021.10.02 |
[문자열] 메뉴 리뉴얼 (0) | 2021.09.30 |
[구현] 거리두기 확인하기 (0) | 2021.09.26 |
[문자열] 뉴스 클러스트링 (0) | 2021.09.21 |