728x90
반응형
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
단순 구현 문제이다.
public static void Rotate() {
up--;
if (up < 0) up = 2 * N - 1;
down--;
if (down < 0) down = 2 * N - 1;
if (isRobot[down] == true) {
robot.remove(0);
isRobot[down] = false;
}
moveRobot();
}
1번 설명처럼 컨베이어 벨트를 한 칸 회전 시킨다.
up은 로봇을 올리는 위치, down은 내리는 위치이다. 각 위치를 변경시킨다.
public static void moveRobot() {
if (!robot.isEmpty()) {
for (int i = 0; i < robot.size(); i++) {
//로봇 이동 가능
int nextLocation = (robot.get(i) + 1) % (2 * N);
if (isRobot[nextLocation] == false && A[nextLocation] > 0) {
robot.set(i, nextLocation);
isRobot[nextLocation] = true;
if (nextLocation == 0)
isRobot[2 * N - 1] = false;
else
isRobot[nextLocation - 1] = false;
A[nextLocation]--;
if (A[nextLocation] == 0) cnt++;
}
}
}
if (isRobot[down] == true) {
isRobot[down] = false;
robot.remove(0);
}
addRobot();
}
2번 설명처럼 로봇을 한 칸 움직이도록 한다.
벡터에 저장되어있는 로봇들의 현재 인덱스를 확인하며 다음 칸으로 옮겨준다.
다음칸에 로봇이 없거나 내구도가 있을 때만 이동한다.
로봇이 움직인 후 down을 해야하는 칸에 로봇이 있다면 내려준다.
public static void addRobot() {
if (A[up] > 0) {
isRobot[up] = true;
robot.add(up);
A[up]--;
if (A[up] == 0) cnt++;
}
if (cnt < K) {
level++;
Rotate();
}
}
로봇을 추가 시켜준다. 올려야 하는 칸의 내구도가 있다면 로봇을 올려준다.
만약 내구도가 0인 칸이 K이상이면 끝, 아니라면 level을 올려주고 다시 Rotate함수로 돌아간다.
반응형
전체 코드
import java.util.Scanner;
import java.util.Vector;
public class Main {
static int N, K, cnt = 0, level = 1;
static int up, down;
static int[] A;
static Boolean[] isRobot;
static Vector<Integer> robot = new Vector<Integer>();
public static void Rotate() {
up--;
if (up < 0) up = 2 * N - 1;
down--;
if (down < 0) down = 2 * N - 1;
if (isRobot[down] == true) {
robot.remove(0);
isRobot[down] = false;
}
moveRobot();
}
public static void moveRobot() {
if (!robot.isEmpty()) {
for (int i = 0; i < robot.size(); i++) {
//로봇 이동 가능
int nextLocation = (robot.get(i) + 1) % (2 * N);
if (isRobot[nextLocation] == false && A[nextLocation] > 0) {
robot.set(i, nextLocation);
isRobot[nextLocation] = true;
if (nextLocation == 0)
isRobot[2 * N - 1] = false;
else
isRobot[nextLocation - 1] = false;
A[nextLocation]--;
if (A[nextLocation] == 0) cnt++;
}
}
}
if (isRobot[down] == true) {
isRobot[down] = false;
robot.remove(0);
}
addRobot();
}
public static void addRobot() {
if (A[up] > 0) {
isRobot[up] = true;
robot.add(up);
A[up]--;
if (A[up] == 0) cnt++;
}
if (cnt < K) {
level++;
Rotate();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();
A = new int[2 * N];
isRobot = new Boolean[2 * N];
up = 0;
down = N - 1;
for (int i = 0; i < 2 * N; i++) {
A[i] = sc.nextInt();
isRobot[i] = false;
}
Rotate();
System.out.println(level);
}
}
728x90
반응형
'코테 > JAVA' 카테고리의 다른 글
[백준 23288/JAVA] 주사위 굴리기2 (0) | 2023.08.03 |
---|---|
[ALGOSPOT - SUSHI/JAVA] 회전초밥 (1) | 2023.07.31 |
[백준 14502 / JAVA] 연구소 (0) | 2023.07.12 |
[백준 19236 / JAVA] 청소년 상어 (0) | 2023.07.09 |
[백준 17779 / JAVA] 게리맨더링 2 (0) | 2023.07.04 |