Skip to content

Commit f665d40

Browse files
committed
[Gold V] Title: 컨베이어 벨트 위의 로봇, Time: 304 ms, Memory: 19424 KB -BaekjoonHub
1 parent ca92f7d commit f665d40

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-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+
메모리: 19424 KB, 시간: 304 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 4월 11일 16:09:47
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: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static int n, k;
7+
static int[] A;
8+
static boolean[] robot;
9+
10+
public static void main(String[] args) throws IOException {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
13+
StringTokenizer st;
14+
st = new StringTokenizer(br.readLine());
15+
n = Integer.parseInt(st.nextToken());
16+
k = Integer.parseInt(st.nextToken());
17+
18+
A = new int[2 * n];
19+
robot = new boolean[n];
20+
21+
st = new StringTokenizer(br.readLine());
22+
for (int i = 0; i < A.length; i++) {
23+
A[i] = Integer.parseInt(st.nextToken());
24+
25+
}
26+
27+
System.out.println(simulation());
28+
29+
}
30+
31+
private static int simulation() {
32+
int cnt = 0;
33+
34+
while (isOk()) {
35+
// 1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전
36+
int tmp = A[A.length - 1];
37+
for (int i = A.length - 1; i > 0; i--) {
38+
A[i] = A[i - 1];
39+
}
40+
A[0] = tmp;
41+
42+
for (int i = robot.length - 1; i > 0; i--) {
43+
robot[i] = robot[i - 1];
44+
}
45+
robot[0] = false;
46+
robot[n - 1] = false;
47+
48+
// 2. 가장 먼저 벨트에 올라간 로봇부터 벨트가 회전하는 방향으로 한칸 이동 가능
49+
// 로봇 이동위해 이동하려는 칸에 로봇없으며 그 칸의 내구도가 1이상 남아있어야함
50+
for (int i = robot.length - 1; i > 0; i--) {
51+
if (robot[i - 1] && !robot[i] && A[i] >= 1) {
52+
A[i]--;
53+
robot[i] = true;
54+
robot[i - 1] = false;
55+
}
56+
}
57+
58+
// 3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇 올림
59+
if (A[0] > 0) {
60+
robot[0] = true;
61+
A[0]--;
62+
}
63+
64+
cnt++;
65+
}
66+
67+
return cnt;
68+
}
69+
70+
private static boolean isOk() {
71+
// 4. 내구도가 0 칸의 개수가 k개 이상이라면 과정을 종료 , 그렇지 않다면 1번으로 돌아감
72+
int cnt = 0;
73+
for (int i = 0; i < A.length; i++) {
74+
if (A[i] == 0) {
75+
cnt++;
76+
}
77+
if (cnt >= k)
78+
return false;
79+
}
80+
return true;
81+
}
82+
83+
}

0 commit comments

Comments
 (0)