20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
[문제]
일차원 배열을 2 * N + 1개를 받아 순환하며 단계별로 해결하는 문제였다.
어렵게 생각하지 않고, 이렇게
- 벨트가 한 칸 회전한다.
- 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
- 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
주어진 단계를 함수로 빼고 이를 반복으로 돌려 단계의 count를 세면 풀 수 있는 문제다.
로봇이 올라갈 수 있는지를 확인하는 boolean 배열을 만들어 함께 돌리면서 내구성도 확인할 수 있었다.
[소스 코드]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj20055_컨테이너벨트 {
static int N, K;
static int[] container;
static boolean[] check;
static int blank;
static int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
container = new int[N * 2 + 1];
check = new boolean[N * 2 + 1];
blank = 0;
result = 0;
container[0] = 0;
st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i < N * 2 + 1; i++) {
container[i] = Integer.parseInt(st.nextToken());
}
while (true) {
++result;
moveContainer();
stepBy();
if (blank >= K)
break;
}
System.out.println(result);
}
// 1.벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
static void moveContainer() {
container[0] = container[N * 2];
check[0] = check[N * 2];
for (int i = N * 2; i > 1; i--) {
container[i] = container[i - 1];
check[i] = check[i - 1];
}
container[1] = container[0];
check[1] = check[0];
}
// 2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한칸 이동할 수 있으면 이동.
// 내구도 1이상이어야함
static void stepBy() {
if (check[N] == true) {
check[N] = false;
}
for (int i = N - 1; i > 0; i--) {
if (check[i] == false)
continue;
if (container[i + 1] > 0 && check[i + 1] == false) {
check[i] = false;
check[i + 1] = true;
if (--container[i + 1] == 0)
blank++;
}
}
if (container[1] > 0 && check[1] == false) {
check[1] = true;
if (--container[1] == 0)
blank++;
}
if (check[N] == true)
check[N] = false;
}
}
[리뷰]
'Algorithm' 카테고리의 다른 글
[백준/BOJ][JAVA] 1018 - 체스판 다시 칠하기 (0) | 2021.12.15 |
---|---|
[ 백준/BOJ ][JAVA] 15651 - N과 M(3) (0) | 2021.12.11 |
[백준/BOJ][JAVA] 2660 - 회장뽑기 (0) | 2021.12.10 |
[백준/BOJ][JAVA] 18405 - 경쟁적 전염 (0) | 2021.12.09 |
[백준/BOJ][JAVA] 2947 나무 조각 (0) | 2021.12.07 |