코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 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 = [7456]
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

+ Recent posts