티스토리 뷰
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main_BOJ_20055 {
static int N, K;
static boolean[] robots;
static int[] belts;
static int cnt=0;
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());
robots=new boolean[2*N];
belts=new int[2*N];
st=new StringTokenizer(br.readLine());
for (int i=0; i<2*N; i++) {
belts[i]=Integer.parseInt(st.nextToken());
}
int step=0;
while (check()) {
rotate();
move();
load();
step++;
}
System.out.println(step);
}
private static void rotate() {
robots[N-1]=false;
int temp1=belts[2*N-1];
for (int i=2*N-1; i>0; i--) {
belts[i]=belts[i-1];
}
belts[0]=temp1;
boolean temp2=robots[2*N-1];
for (int i=2*N-1; i>0; i--) {
robots[i]=robots[i-1];
}
robots[0]=temp2;
robots[N-1]=false;
}
private static void move() {
for (int i=2*N-1; i>=0; i--) {
int next=(i+1)%(2*N);
if (robots[i] && !robots[next] && belts[next]>=1) {
robots[i]=false;
robots[next]=true;
belts[next]-=1;
}
}
}
private static void load() {
if (!robots[0] && belts[0]>0) {
robots[0]=true;
belts[0]-=1;
}
}
private static boolean check() {
int cnt=0;
for (int i = 0; i < belts.length; i++) {
if (belts[i]==0) {
cnt++;
}
}
if (cnt<K) return true;
else return false;
}
}
시뮬레이션 문제..
괜히 어렵게 풀었다가 93퍼에서 계속 틀렸습니다 뜨길래 아예 갈아엎어(??) 버렸다..
belts[i]=>벨트에서 i번째 칸에 있는 것의 내구도
robots[i]=>벨트에서 i번째 칸에 로봇이 올라와 있는지
rotate 함수: 2*N-1 번째부터 시작해 앞의 값을 가져오는 식으로 회전을 진행한다. 로봇도 마찬가지로 움직여준다. (벨트과 같이 이동하므로) 이때 주의할 점은 회전 전, 후로 내리는 위치에 있는 로봇을 내려줘야 하는 것이다.
move 함수: 2*N-1 번째부터 시작해(먼저 올라온 로봇일수록 끝 칸에 존재한다) next 칸에 로봇이 없고, next 칸에 내구도가 1 이상일 경우에만 로봇을 옮겨주도록 한다.
load 함수: 0번째 벨트에 로봇 없고, 내구도 1 이상인 경우 올려준다.
이 문제는 간단하게..배열 2개를 이용한다. 그리고 그 배열의 인덱스를 "i번째 칸" 으로 간주해준다.
'Problem Solving' 카테고리의 다른 글
[BOJ 1062] 가르침 (Java) (0) | 2022.03.31 |
---|---|
[BOJ 1600] 말이 되고픈 원숭이 (Java) (0) | 2022.03.30 |
[BOJ 2636] 치즈 (Java) (0) | 2022.03.30 |
[BOJ 1504] 특정한 최단 경로 (Java) (0) | 2022.03.28 |
[프로그래머스] 길 찾기 게임 (Java) (0) | 2022.03.25 |