기록하고 까먹지 말기

다리를 지나는 트럭 본문

전공/프로그래머스

다리를 지나는 트럭

yha97 2023. 5. 29. 22:16

날짜 : 2023. 05. 29

사용 언어 : python

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

코드

from collections import deque
def solution(bridge_length, weight, truck_weights): # 최대 대수, 최대 하중, 트럭 무게
    q = deque()
    res = 0
    for i in range(bridge_length): q.append(0)
    i, s = 0, 0  # 순서, 다리에 올라간 무게, 개수
    while True:
        if i not in range(len(truck_weights)): break
        res += 1
        out = q.popleft()
        s -= out
        if s + truck_weights[i] <= weight:
            s += truck_weights[i]
            q.append(truck_weights[i])
            i += 1
        else:
            q.append(0)
    while s > 0:
        res += 1
        out = q.popleft()
        s -= out
        q.append(0)
    return res

 

 

풀이

- 다리의 각 위치에 해당하는 무게를 전부 0으로 설정한 데크로 생성한 다음 조건에 맞추어 순회한다.

- 각 트럭의 무게를 기록하는 변수 s 값에 따라 값을 추가했을 경우 전체 무게 한도가 초과되지 않으면 추가, 아니라면 이동하는 케이스로 돌린다.(뒤에 0을 추가)

- 이후 모든 트럭들이 다리에 들어와 첫 번째 while문이 끝났다 해도 다리에 트럭이 남아있을 수 있기 때문에 이를 전부 빼주는 작업이 필요하다. 

- 그렇기 때문에 또다시 while문을 사용해 뒤에 0을 push하는 방식으로 전개한다.

 

 

알게된 점

- 많은 실수를 했다.

- 큐를 생성하면서 q로 생성했고, 다리에 있는 트럭의 수를 세는 변수로 q를 선언하는 바람에 오버라이딩되어 popleft가 먹히지 않았다.

- 프로그래머스 환경에서는 어떤 라인에서 문제였는지를 잡아주지 않기 때문에 고민끝에 pycharm 환경에서 잡아낼 수 있었고, 문제를 해결할 수 있었다.

- 문제 자체는 간단했지만 지문이 너무 애매했고, 변수를 선언함에 있어서 너무 안일하게 실수를 범한 것 같다.

- 지난 백준에서 문제를 풀 때에도 비슷한 실수를 한 것 같은데 그냥 q라고 하기보다는 queue라고 선언해서 선언 시 중복이 되지 않도록 하는 습관을 들여야겠다.

 

 

참고 사이트