Skip to content

Commit e3ced2a

Browse files
committed
[Gold V] Title: 컨베이어 벨트 위의 로봇, Time: 324 ms, Memory: 79512 KB -BaekjoonHub
1 parent e76958b commit e3ced2a

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# [Gold V] 컨베이어 벨트 위의 로봇 - 20055
2+
3+
[문제 링크](https://www.acmicpc.net/problem/20055)
4+
5+
### 성능 요약
6+
7+
메모리: 79512 KB, 시간: 324 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 3월 14일 21:52:35
16+
17+
### 문제 설명
18+
19+
<p><img alt="" src="https://upload.acmicpc.net/2d0d6aba-da7d-45b0-a450-a47cc1016dc0/-/crop/512x358/0,79/-/preview/" style="width: 256px; height: 179px; float: right;">길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부터 2N까지의 번호가 매겨져 있다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/396139ea-9079-4115-9a00-446865434900/-/preview/" style="width: 476px; height: 224px;"></p>
22+
23+
<p>벨트가 한 칸 회전하면 1번부터 2N-1번까지의 칸은 다음 번호의 칸이 있는 위치로 이동하고, 2N번 칸은 1번 칸의 위치로 이동한다. i번 칸의 내구도는 A<sub>i</sub>이다. 위의 그림에서 1번 칸이 있는 위치를 "<strong>올리는 위치</strong>", N번 칸이 있는 위치를 "<strong>내리는 위치</strong>"라고 한다.</p>
24+
25+
<p>컨베이어 벨트에 박스 모양 로봇을 하나씩 올리려고 한다. 로봇은 올리는 위치에만 올릴 수 있다. 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다. 로봇은 컨베이어 벨트 위에서 스스로 이동할 수 있다. 로봇을 올리는 위치에 올리거나 로봇이 어떤 칸으로 이동하면 그 칸의 내구도는 즉시 1만큼 감소한다.</p>
26+
27+
<p>컨베이어 벨트를 이용해 로봇들을 건너편으로 옮기려고 한다. 로봇을 옮기는 과정에서는 아래와 같은 일이 순서대로 일어난다.</p>
28+
29+
<ol>
30+
</ol>
31+
32+
<ol>
33+
<li>벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.</li>
34+
<li>가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
35+
<ol>
36+
<li>로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.</li>
37+
</ol>
38+
</li>
39+
<li>올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.</li>
40+
<li>내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.<a id="comment-107823"></a></li>
41+
</ol>
42+
43+
<p>종료되었을 때 몇 번째 단계가 진행 중이었는지 구해보자. 가장 처음 수행되는 단계는 1번째 단계이다.</p>
44+
45+
### 입력
46+
47+
<p>첫째 줄에 N, K가 주어진다. 둘째 줄에는 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>2N</sub>이 주어진다.</p>
48+
49+
### 출력
50+
51+
<p>몇 번째 단계가 진행 중일때 종료되었는지 출력한다.</p>
52+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Foundation
2+
3+
struct Belt {
4+
var robot: Bool // 로봇이 있는지
5+
var duration: Int // 내구도
6+
}
7+
8+
let input = readLine()!.components(separatedBy:" ").map{Int($0)!}
9+
let N = input[0], K = input[1] // 벨트 칸 수, 내구도 0의 수용치
10+
let arr = readLine()!.components(separatedBy: " ").map{Int($0)!}
11+
var belts = [Belt]()
12+
for (i, x) in arr.enumerated() {
13+
belts.append(Belt(robot: false, duration: x))
14+
}
15+
var result = 0
16+
17+
while true {
18+
result += 1
19+
// 1
20+
belts.insert(belts.removeLast(), at: 0) // 맨 마지막 벨트를 앞으로
21+
if belts[N-1].robot == true { belts[N-1].robot = false }
22+
// 2
23+
for i in stride(from: N-2, to: -1, by: -1) { // 로봇의 이동
24+
if belts[i].robot == true, belts[i+1].robot == false, belts[i+1].duration > 0 {
25+
belts[i].robot = false
26+
belts[i+1].robot = true
27+
belts[i+1].duration -= 1
28+
if i+1 == N-1 { belts[i+1].robot = false } // N인덱스에 로봇이 위치하면 바로 내려준다.
29+
}
30+
}
31+
// 3
32+
if belts[0].robot == false && belts[0].duration > 0 {
33+
belts[0].duration -= 1
34+
belts[0].robot = true
35+
}
36+
// 4
37+
let zeroCount = belts.filter{$0.duration == 0}.count
38+
if zeroCount >= K {
39+
break
40+
}
41+
}
42+
print(result)

0 commit comments

Comments
 (0)