Algorithm
[프로그래머스] 다리를 지나는 트럭
쑤야.
2024. 1. 23. 14:15
https://school.programmers.co.kr/learn/courses/30/lessons/42583
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
- 경과 시간마다 다리를 지난 새로운 트럭이 발생할 수 있으며, 다리를 건너고 있는 트럭이 발생할 수 있다
→ 1초마다 반복문 수행하며 점검 - 동시에 여러 대가 다리를 지날 수 있으며, 각 트럭마다 시간을 체크해야 한다
→ 자료구조 큐를 사용하며, 트럭의 인덱스와 건너기 시작한 시간을 저장한다
로직
- 현재 다리를 건너는 트럭 무게의 총합을 빠르게 접근하기 위해 변수를 선언한다
- time을 0으로 초기화하여 repeat while문을 통해 1초마다 반복문을 수행해준다
- 다리를 지난 트럭이 존재하는지 먼저 점검한다. 이후 새로운 트럭이 추가될 수 있는지 확인 후, 추가해준다
코드
1. Swift 풀이
func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
var cross = [(Int, Int)]() //(인덱스, 다리에 올라온 시간)
var next = 0 //다음에 올라올 트럭 포인터
var weightSum = 0 //다리에 올라와 있는 트럭들 무게 총합
var time = 0
repeat {
time += 1
//지난 트럭 제거
if !cross.isEmpty && cross.first!.1 + bridge_length == time {
let pass = cross.removeFirst()
weightSum -= truck_weights[pass.0]
}
//새로운 트럭 추가
if next < truck_weights.count && weightSum + truck_weights[next] <= weight {
weightSum += truck_weights[next]
cross.append((next, time))
next += 1
}
} while !cross.isEmpty
return time
}
2. Python 풀이
def solution(bridge_length, weight, truck_weights):
cross = []
next = 0
weightTotal = 0
time = 0
while True:
time += 1
# 트럭 제거
if len(cross) > 0 and cross[0][1] + bridge_length == time:
weightTotal -= truck_weights[cross[0][0]]
del cross[0]
# 트럭 추가
if next < len(truck_weights) and weightTotal + truck_weights[next] <= weight:
cross.append([next, time])
weightTotal += truck_weights[next]
next += 1
if len(cross) == 0 :
break
return time