본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 13335 트럭을 지나는 트럭

뭔가 익숙하다 싶었는데 역시나 프로그래머스에서 풀었던 문제였다.

 

https://proprotrainee.tistory.com/42

 

[ 프로그래머스 ] 다리를 지나는 트럭

/ 코드 1 / def solution(bridge_length, weight, truck_weights): q=[0]*bridge_length sec=0 while q: sec+=1 q.pop(0) if truck_weights: if sum(q)+truck_weights[0]<=weight: q.append(truck_weights.pop(0))..

proprotrainee.tistory.com

 

당시에 풀이할 때 다리 내에서 차 이동하는 걸 어떤 식으로 풀어나갈 지 되게 고민하다가 다른 분들 풀이 보고 아하!했던 기억이 있는데 그 때 확실히 안 익히고 넘어간건지 아리까리했다.

기억을 되살려서 간신히 풀기는 했는데 문제 비틀어서 나오면 풀어낼 자신 없는 수준이라는게 한탄스럽..

뭐 잘 정리해보자.

 

import sys
from collections import deque 
input = sys.stdin.readline

n, w, L = map(int, input().split())
trucks = deque(list((map(int, input().split()))))
bridge = deque([0]*w)

time = 0

while trucks:
  bridge.popleft()
  if len(bridge) < w and sum(bridge) + trucks[0] <= L:
      bridge.append(trucks.popleft())
  else:
    bridge.append(0)
  time += 1

print(time+len(bridge))

 

1. 우선 선입선출로 나가게 될 trucks,bridge는 큐로 빼낼 수 있게 deque자료구조 사용 결정.

2. 유일한 동작인 트럭 이동을 시작해도 되는 지 조건 확인 => 다리길이, 무게 확인

3. 2가 가능하면 truck의 맨 앞의 녀석 빼서 다리에 올리기

4. !! 여기가 기억 안 났던 부분인데 0 삽입해서 이동한 것처럼 처리. 이게 왜 가능한지는 아래 2 조건과 함께 수행되는거라

 -> 애초에 bridge큐의 각 값을 0으로 설정한 이유는 무게가 없이 공간을 차지하기 위해서!

 -> 매 시간단위마다 bridge 맨 앞의 값은 사라진다. 그래서 해당 프로세스에서 조건에 맞지 않는 경우 0을 넣으면 이동한 것처럼 구현되는 것! . 

5. 하나 더 놓치면 안되는 것은 트럭을 기준으로 if문이 반복되기에 남은 트럭의 유무로 while문을 돌렸다. 다만, 트럭을 다 소모한 뒤에도 '다리에 있는 트럭들'이 다리를 다 지나야하는 것이 전체 프로세스의 종료조건이기에 해당 길이만큼 시간에 더해줘야한다.

 

은근히 빼먹기 쉬운 부분이 있어서 꼼꼼하게 생각할 부분이 많은게 정말 시뮬레이션다운 문제였다. 

 

 

https://www.acmicpc.net/problem/13335

 

13335번: 트럭

입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트

www.acmicpc.net