전공/프로그래머스
다리를 지나는 트럭
yha97
2023. 5. 29. 22:16
날짜 : 2023. 05. 29
사용 언어 : python
문제
코드
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라고 선언해서 선언 시 중복이 되지 않도록 하는 습관을 들여야겠다.
참고 사이트
-