뭔가 익숙하다 싶었는데 역시나 프로그래머스에서 풀었던 문제였다.
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
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ / 파이썬 ] 2583 영역 구하기 (0) | 2022.10.08 |
---|---|
[ BOJ /파이썬 ] 11660 구간 합 (0) | 2022.10.06 |
[ BOJ / 파이썬 ] 14499 주사위 굴리기 (0) | 2022.10.05 |
[ BOJ / 파이썬 ] 15665 N과M(11) (0) | 2022.08.30 |
[ BOJ / 파이썬 ] 15664 N과M(10) (0) | 2022.08.30 |