📖 문제
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
💡 풀이 방식
• 구현, 시뮬레이션
필요 자료구조
- 컨베이어 벨트 칸의 내구도 저장용 1차원 int형 배열 (크기 : 2 * N)
- 해당 칸에 로봇 존재 여부 저장할 1차원 boolean형 배열 (※ 크기 : N) → true : 로봇 O, false : 로봇 X
내구도가 0인 칸의 개수가 K개 미만인 동안 아래 3단계를 반복한다.
1. 컨베이어 벨트와 로봇 위치를 한 칸 이동한다.
// 컨베이어 벨트 이동
int tmp = A[A.length - 1];
for(int i = A.length - 1 ; i >= 1 ; i--) {
A[i] = A[i - 1];
}
A[0] = tmp;
// 로봇 이동
for(int i = robot.length - 1 ; i >= 1 ; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false;
robot[N - 1] = false; // N번 칸의 로봇은 내리기
2. 회전 방향으로 한 칸 이동 가능하다면 이동시킨다.
→ 이동 가능 조건 : 이동하려는 칸 i에 로봇이 없고 (robot[i] == false), 내구도가 1 이상 남아있어야 함 (A[i] >= 1)
for(int i = robot.length - 1 ; i >= 1 ; i--) {
// 이동하려는 칸에 로봇이 없으며, 내구도가 1 이상 남아있어야 이동 가능
if(robot[i - 1] && !robot[i] && A[i] >= 1) {
A[i]--;
robot[i] = true; // 로봇 O
robot[i - 1] = false; // 로봇 X
}
}
3. 올리는 위치 0에 있는 칸의 내구도가 0보다 크다면, 올리는 위치 0에 로봇을 올린다.
if(A[0] > 0) {
robot[0] = true; // 로봇 올리기
A[0]--; // 내구도 -1
}
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import java.util.*;
import java.io.*;
public class Main {
static int N, K;
static int[] A;
static boolean[] robot; // true: 로봇 O / false: 로봇 X
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
A = new int[2*N];
robot = new boolean[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < 2 * N ; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
System.out.println(simulate());
}
private static int simulate() {
int cnt = 0;
while(cntZero() < K) {
// 1. 벨트가 각 칸에 있는 로봇과 함께 한 칸 회전
int tmp = A[A.length - 1];
for(int i = A.length - 1 ; i >= 1 ; i--) {
A[i] = A[i - 1];
}
A[0] = tmp;
for(int i = robot.length - 1 ; i >= 1 ; i--) {
robot[i] = robot[i - 1];
}
robot[0] = false; // 💥 로봇 제거!!
robot[N - 1] = false; // 💥 내려가는 위치의 로봇 제거!!
// 2. 회전 방향으로 한 칸 이동 가능하다면 이동.
for(int i = robot.length - 1 ; i >= 1 ; i--) {
if(robot[i - 1] && !robot[i] && A[i] >= 1) {
A[i]--;
robot[i] = true; // 로봇 O
robot[i - 1] = false; // 로봇 X
}
}
// 3. 올리는 위치에 있는 칸의 내구도가 0보다 크면 로봇 올리기
if(A[0] > 0) {
robot[0] = true;
A[0]--;
}
cnt++;
}
return cnt;
}
private static int cntZero() {
int zero = 0;
for(int i : A) {
if(i == 0)
zero++;
}
return zero;
}
}
|
cs |
💦 어려웠던 점
- 단계별로 차근차근 조건을 만족하도록 구현하자! (근데 구현 시간도 줄이자!)
- 로봇 위치 배열을 2*N까지 할 생각을 했다. 그런데 생각해보니 N-1 위치가 되면 로봇이 내려가므로, 아랫면이 되는 N~ (2*N - 1) 뒤쪽까지 고려할 필요가 없었던 것이었다~~
- 3단계 구현을 빠뜨렸다,,,,ㅎ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[백준] 20055번 컨베이어 벨트위의 로봇 - Java, 자바
골드 5https://www.acmicpc.net/problem/20055구현 문제 벨트가 각 칸 위에 있는 로봇과 함께 한칸 회전 로봇 이동 (이동할 다음칸에 로봇 없으며, 그 칸의 내구도가 1이상 있을 때)올리는 위치에 있는 칸의
velog.io
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 13335번: 트럭 (0) | 2024.03.21 |
---|---|
[백준/JAVA] 18427번: 함께 블록 쌓기 (0) | 2024.03.20 |
[백준/JAVA] 2933번: 미네랄 (0) | 2024.03.12 |
[백준/JAVA] 2638번: 치즈 (0) | 2024.03.12 |
[백준/JAVA] 7682번: 틱택토 (0) | 2024.03.12 |