난이도 : Lv 2
분류 : 스택 / 큐
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import Foundation
func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
var bridge = Array(repeating: 0, count: bridge_length)
var trucks = truck_weights
var time = 0
var bridgeWeight = 0
while !bridge.isEmpty {
time += 1
// 한 번 처리 마다 1초씩 증가한다.
bridgeWeight -= bridge.removeFirst()
// 지나간 트럭의 무게를 다리가 감당할 무게에서 빼준다.
if let t = trucks.first {
if t + bridgeWeight <= weight {
// 대기중인 트럭의 무게와 현재 다리가 감당할 무게를 더해 다리가 감당할 수 있는 무게와 비교한다.
let tmp = trucks.removeFirst()
// 대기 트럭이 다리를 건널 준비를 한다.
bridge.append(t)
// 다리에 진입한다.
bridgeWeight += tmp
// 다리에 진입했으므로 다리가 감당할 무게에 더해준다.
} else {
bridge.append(0)
// 다리가 감당할 수 없는 무게라면 트럭을 보내지 않는다.
}
}
}
return time
}
풀이
1. 다리가 감당할 수 있는 무게 만큼의 트럭이 지나갈 수 있다.
2. 다리의 길이 만큼의 배열을 만들어서 트럭을 지나가게 한다.
3. 길이 3, 하중 10 의 다리를 무게 [7, 3, 2, 5] 트럭들이 건너는 과정은 아래와 같다.
다리 | 다리에 가하는 무게 | 남은 트럭들 | 시간 |
[ 0, 0, 0 ] | 0 | [ 7, 3, 2, 5 ] | 0 |
[ 0, 0, 7 ] | 7 | [ 3, 2, 5 ] | 1 |
[ 0, 7, 3 ] | 10 | [ 2, 5 ] | 2 |
[ 7, 3, 0 ] | 10 | [ 2, 5 ] | 3 |
[ 3, 0, 2 ] | 5 | [ 5 ] | 4 |
[ 0, 2, 5 ] | 7 | [ ] | 5 |
[ 2, 5, 0 ] | 7 | [ ] | 6 |
[ 5, 0, 0 ] | 5 | [ ] | 7 |
[ 0, 0, 0 ] | 0 | [ ] | 8 |
P.S
생각보다 고민을 많이 했으나 결국 다른 사람의 풀이를 보게 만든 문제였다.
링크드 리스트를 이용해 큐를 구현해서 사용할까 하다가. 오버헤드가 발생하지만 removeFirst() 를 사용해서 해결했다.
링크드 리스트를 정리하면서 다시 풀어봐야겠다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 베스트앨범 (0) | 2023.02.21 |
---|---|
[프로그래머스] 위장 (0) | 2023.02.21 |
[프로그래머스] 프린터 (0) | 2023.02.17 |
[프로그래머스] 올바른 괄호 (0) | 2023.02.17 |
[프로그래머스] 기능 개발 (0) | 2023.02.13 |