코딩테스트/코딩테스트 문제
코딩테스트 준비 - 프로그래머스: 다리를 지나는 트럭 풀이/상세 설명/스택과 큐 (파이썬)
공부가싫다가도좋아
2021. 7. 2. 16:25
반응형
다리를 지나는 트럭 풀이
문제풀러가기
https://programmers.co.kr/learn/courses/30/lessons/42583?language=python3
코딩테스트 연습 - 다리를 지나는 트럭
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈
programmers.co.kr
문제 분석
1. 스택과 큐를 활용하면 된다.
2. 시간을 세는 과정은 아래 그림과 같다.
코드1
def solution(bridge_length, weight, truck_weights):
time=0
bridge=[0]*bridge_length
while bridge:
time+=1
bridge.pop(0)
if truck_weights:
if (sum(bridge)+truck_weights[0])<=weight:
bridge.append(truck_weights.pop(0))
else:
bridge.append(0)
return time
* 일반적으로 생각할 수 있는 로직
* 효율성이 매우 낮다
코드2
*코드1과 같은 로직이지만, 코드1을 조금 더 다듬어서 효율성을 높였다.
from collections import deque
def solution(bridge_length, weight, truck_weights):
truck_weights=truck_weights.reverse()
time=0
bridge=deque([0]*bridge_length)
rs=0
while bridge:
time+=1
rs-=bridge.popleft()
if truck_weights:
if (rs+truck_weights[0])<=weight:
rs+=truck_weights[0]
bridge.append(truck_weights.pop())
else:
bridge.append(0)
return time
* sum을 없애주니 확실히 시간이 더 줄었다.
코드 풀이
from collections import deque
def solution(bridge_length, weight, truck_weights):
truck_weights=truck_weights.reverse() #pop(0)말고 바로 pop()을 사용하기 위해 뒤집음
time=0
bridge=deque([0]*bridge_length) #다리 길이만큼 공간을 만들어줌.
rs=0 # 다리위의 트럭무게를 표시하기 위한 변수
while bridge:
time+=1 #옆으로 트럭을 하나씩 넣을때마다 time+1을 해줌
rs-=bridge.popleft()
if truck_weights:
if (rs+truck_weights[0])<=weight:
rs+=truck_weights[0]
bridge.append(truck_weights.pop())
else:
bridge.append(0) #옆에 0으로 채워주면, 트럭이 점점 왼쪽으로 밀려나게됨.
return time
반응형