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 배열에 추가하였다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |

'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 |