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

구현 문제다. 다리를 어떤 자료구조로 구현해낼지 고민해야 하는 문제다. cpp의 경우 큐 혹은 덱을 이용하여 풀면 되겠지만 스위프트의 경우에 큐나 덱이 없기에 배열을 사용해야 한다.

 

풀이

다리를 표현하는 bridge: Array(repeating:0, count:w) 배열을 생성하여 허용 중량까지만 담아내고 매 차례마다 원소들을 다음 인덱스로 밀어주는 함수 enter(truck:Int)를 구현하였다. 최대 중량과 현재 중량을 비교하는 부분에서 고민을 했던 문제다. 다리 끝자락에 위치한 트럭이 내리자마자 조건이 맞다면 바로 다음 트럭이 들어가야 하기 때문에 (현재 중량 - 마지막 트럭 무게 + 들어가야 할 트럭 무게) <= 최대 중량이라는 조건으로 매 차례 함수를 수행하였다. 트럭이 들어갈 수 없다면 0 무게를 bridge 배열에 추가하였다.

 

정답 코드

import Foundation
let nwl = readLine()!.split(separator: " ").map{Int($0)!}
let n = nwl[0]
let w = nwl[1]
let l = nwl[2]
var trucks = Array(readLine()!.split(separator: " ").map{Int($0)!}.reversed())
var time = 0
var bridge = Array(repeating: 0, count: w)
var weight = 0
func enter(truck:Int){
weight -= bridge.last!
for i in stride(from: w-1, through: 1, by: -1){
bridge[i] = bridge[i-1]
}
bridge[0] = truck
weight += truck
}
while !trucks.isEmpty{
time+=1
if weight+trucks.last!-bridge.last! <= l{
enter(truck: trucks.removeLast())
}else{
enter(truck: 0)
}
}
while weight>0{
time+=1
enter(truck: 0)
}
print(time)
view raw 13335.swift hosted with ❤ by GitHub

'Problem Solving > BOJ' 카테고리의 다른 글

[21608] 상어 초등학교  (0) 2022.11.09
[14891] 톱니바퀴  (0) 2022.11.09
[1245] 농장 관리  (0) 2022.11.04
[1148] 단어 만들기  (0) 2022.11.03
[1195] 킥다운  (1) 2022.11.02

+ Recent posts