https://www.acmicpc.net/problem/20055
고민한 부분
컨베이어 벨트를 회전시키는 부분에서 고민이 좀 있었다. 처음에는 2차원 배열로 요소들을 한칸씩 이동 시키는 방식을 생각했지만, 컨베이어 벨트를 잘라서 펼치면 결국엔 한줄이 되고 양 끝이 서로 이어져 있으므로
기존 컨베이어 벨트 배열이 1 2 3 4 5 6 이면 removelast와 insert로 마지막 요소를 배열의 첫번째에 넣어주면
2 3 4 5 6 1 이렇게 한칸씩 회전을 시킬 수 있다.
swift에서 배열을 이용하여 시간복잡도는 O(n)이였지만, 디큐를 이용한다면 시간복잡도를 O(1)로 줄일수 있다. 하지만 시뮬레이션이라 제한도 널럴해서 그냥 구현함.
import Foundation
struct Blank {
var life: Int
var hasRobot: Bool
}
let nk = readLine()!.split(separator: " ").map { Int($0)! }
let n = nk[0]
let k = nk[1]
var convainer: [Blank] = []
convainer = readLine()!.split(separator: " ").map { Int($0)! }.map{ .init(life: $0, hasRobot: false)}
var answer = 0
var zeroBlankCount = 0
func lotateConvainer() {
convainer.insert(convainer.removeLast(), at: 0)
}
func countZeroBlank() {
var count = 0
convainer.forEach { blank in
if blank.life == 0 {
count += 1
}
}
zeroBlankCount = count
}
while zeroBlankCount < k {
answer += 1
lotateConvainer()
if convainer[n-1].hasRobot {
convainer[n-1].hasRobot = false
}
for i in stride(from: n-2, through: 0, by: -1) {
if convainer[i].hasRobot && convainer[i+1].life >= 1 && !convainer[i+1].hasRobot {
convainer[i+1].life -= 1
convainer[i].hasRobot = false
if i == n-2 {
continue
}
convainer[i+1].hasRobot = true
}
}
if convainer[0].life >= 1 && !convainer[0].hasRobot {
convainer[0].hasRobot = true
convainer[0].life -= 1
}
countZeroBlank()
}
print(answer)
'Algorithm > 백준' 카테고리의 다른 글
Swift) 백준 16236번 아기 상어 - G3 (1) | 2023.12.28 |
---|---|
Swift) 백준 16234번 인구이동 - G4 (1) | 2023.12.26 |
Swift) 백준 1713번 후보 추천하기 - S1 (0) | 2023.11.21 |
Swift) 백준 6603 로또 - S2 (0) | 2023.09.23 |
Swift) 백준 2503번 숫자 야구 - S3 (0) | 2023.09.18 |