[프로그래머스] 다리를 지나는 트럭 (Swift)
https://school.programmers.co.kr/learn/courses/30/lessons/42583
스택/큐 (Queue)
N대가 올라갈 수 있는 다리가 있고, 이 다리는 W만큼의 무게만 견딜 수 있음.
이때, 대기하고 있는 M개의 트럭의 무게가 순서대로 담긴 배열이 주어진다.
1초에 한칸씩 이동할 수 있다는 설정이 있는듯(ex. 트럭이 1개여도 다리 길이가 100이면 101초가 걸림)
이때 모든 트럭이 다 다리를 건더는 데 몇초가 걸리는지 반환하는 문제
(모든 트럭 한 대의 무게는 W 이하이다 = 못올라가는 트럭은 없음)
접근 방법
swift 배열을 큐처럼 사용해서 풀이함
0. 다리위에 올라가 있는 트럭 모습을 나타내는 배열 bridge_queue를 만들고 길이가 N만큼 0으로 초기화
0-1. 현재 다리에 올라가 있는 트럭 무게 합을 저장하고 있는 변수 cur_weight, 시간 확인 변수 sec, 매개변수로 받은 트럭대기열 가변변수로 저장한 waiting_trucks
1. 모든 트럭이 지나갈 때 까지 while문 반복 (다리 위 트럭이 비었고, 대기열도 비었을 경우)
1-1. 다리에 가장 앞 트럭이 다리를 완전히 지난다. (bridge_queue에서 가장 앞에 있는 원소를 제거하고 맨 뒤에 0을 삽입, 현재 다리 무게에서도 방금 지나간 트럭의 무게를 제거한다)
1-2. 다음에 트럭이 들어올 수 있는지 확인
- 대기열에 트럭이 없을 경우 pass
- 대기열에 트럭이 있다면, 해당 트럭이 다리위에 올라갔을 때 다리가 무게를 견딜 수 있는지 확인
1-3. 들어올 수 있다면 bridge_queue에 해당 트럭의 무게를 맨뒤에 삽입한 뒤, 현재 다리 무게에도 더해준다. 그리고 대기열에서 그 트럭을 빼주기
2. 반복문이 끝나면 sec에 총 걸린 시간이 담김
오답노트
core dump가 떴었는데, 1-2에서 대기열에 트럭이 없을 경우를 체크해주지 않았기 때문이었음
소스코드
import Foundation
func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
var sec = 0
var bridge_queue = [Int](repeating: 0, count: bridge_length)
var cur_weight = 0 // 현재 다리에 있는 트럭의 무게 합
var waiting_trucks = truck_weights
while cur_weight != 0 || !waiting_trucks.isEmpty {
sec += 1
// 다리에 가장 앞에 있는 트럭 나감
cur_weight -= bridge_queue[0]
bridge_queue.removeFirst()
bridge_queue.append(0)
// 다음에 트럭 들어올 수 있는지 확인
if waiting_trucks.isEmpty {
continue
}
var next_truck = waiting_trucks[0]
if cur_weight+next_truck <= weight {
bridge_queue[bridge_length-1] = next_truck
cur_weight += next_truck
waiting_trucks.removeFirst()
}
}
return sec
}