알고리즘 문제풀이

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

SiO2whocode 2024. 10. 22. 16:34
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

스택/큐 (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
}
728x90