문제가 참,, 여러모로 이해하기 어려웠다,,
다른것보다 갑자기 출력하라고 나온 단어인 '단계'가 무엇인지 예제를 몇개 돌려보고야 알았던 것 같다.
여기선 1-4의 루틴을 한 단계라고 하고, 종료되기까지 총 몇번의 단계를 거쳤는지를 구하면 된다.
처음엔 일의 순서로 나와있는 1,2,3,4가 한 단계를 나타내는 줄 알았고,
예제1의 출력이 '2'번 단계, 즉 '가장 먼저 벨트에 올라간 ~' 라는 줄 알았다. 문제에 모호한 점이 너무 많다 💦
문제 자체가 헷갈렸던 것 외에는 보통의 시뮬레이션 문제처럼 하나씩 구현만 하면 된다.
문제 이해도 힘들고, 까다로운 조건이 너무 많았던 지저분한,,문제,,💦
package simulation;
import java.util.*;
import java.io.*;
public class BOJ_20055_컨베이어벨트위의로봇 {
static class Belt{
int power;
boolean robot;
public Belt(int power) {
this.power = power;
this.robot = false;
}
}
static int N, K;
static Belt[] conv;
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());
conv = new Belt[2*N];
st = new StringTokenizer(br.readLine());
for(int i =0 ; i < 2*N ; i++){
conv[i] = new Belt(Integer.parseInt(st.nextToken()));
}
int stage = 1;
while(true){
// 1. 회전
int p = conv[2*N-1].power;
boolean r = conv[2*N-1].robot;
for(int i = 2*N-1 ; i > 0 ; i--){
conv[i].power = conv[i-1].power;
conv[i].robot = conv[i-1].robot;
}
conv[0].power = p;
conv[0].robot = r;
conv[N-1].robot = false;
// 2. 가장 먼저 올라간 로봇부터, 이동
for(int i = N-1 ; i > 0 ; i--){
if(!conv[i].robot && conv[i-1].robot && conv[i].power >= 1){
conv[i].power --;
conv[i].robot = true;
conv[i-1].robot = false;
}
}
conv[0].robot = false;
conv[N-1].robot = false;
// 3. 올리는 위치에 로봇 올림
if(conv[0].power != 0){
conv[0].robot = true;
conv[0].power --;
}
if(!isValid()) break;
stage++;
}
System.out.println(stage);
}
private static boolean isValid() {
int cnt = 0;
for(int i = 0 ; i < 2*N ; i++){
if(conv[i].power <= 0) cnt++;
}
return cnt < K;
}
}
특별한 반례 없이 문제만 잘 이해하고 예제만 다 맞았다면 통과 가눙