import java.util.*;
import java.io.*;
class Belt{
int durability, id;
boolean robot;
public Belt(int durability, int id, boolean robot) {
super();
this.durability = durability;
this.id = id;
this.robot = robot;
}
@Override
public String toString() {
return "Belt [durability=" + durability + ", id=" + id + ", robot=" + robot + "]";
}
}
public class Main {
static int N,M,count;
static int[] durability = new int[201];
public static void print1D(int[] arr) {
for(int i=0; i<2*N; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) throws IOException {
//Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i=0; i<2*N; i++) {
durability[i] = Integer.parseInt(st.nextToken());
}
//System.out.println(N + " " + M);
//print1D(durability);
//solution
solution();
}
public static void solution() {
List<Belt> beltList = new ArrayList<>();
for(int i=0; i<2*N; i++) {
beltList.add(new Belt(durability[i], i, false));
}
int answer=1;
while(true) {
System.out.println(answer +"번째입니다");
System.out.println(beltList);
//ConveyorBelt 회전
Belt last = beltList.remove(2*N-1);
beltList.add(0, last);
System.out.println("회전시킨다");
//즉시 내린다 내리는 위치에 있다면
if(beltList.get(N-1).robot == true) {
beltList.get(N-1).durability -=1; //여기가 문제 (실수 포인트)
beltList.get(N-1).robot = false;
}
System.out.println(beltList);
System.out.println("이동시킨다");
for(int i =2*N-1; i>=1; i--) {
if(!beltList.get(i).robot && beltList.get(i-1).robot && beltList.get(i).durability !=0) {
beltList.get(i-1).robot =false;
if(i != 2*N-1) { //여기가 문제 (실수 포인트) 지금은 고친 부분
beltList.get(i).robot = false;
}
beltList.get(i).durability -=1;
}
}
System.out.println(beltList);
System.out.println("싣는다");
//그다음 올리는 곳에 싣기!
if(!beltList.get(0).robot && beltList.get(0).durability !=0) {
beltList.get(0).durability -=1; // 하차하는것까지
beltList.get(0).robot = true;
}
System.out.println(beltList);
//K==0인거 체크하기
for(int i=0; i<2*N; i++) {
if(beltList.get(i).durability ==0) {
count+=1;
}
}
System.out.println(count);
if(answer ==1000 || count >=M) {
System.out.println(count);
break;
}
System.out.println();
count = 0;
answer+=1;
}
//System.out.println(beltList);
//System.out.println(answer);
}
}
로봇이 스스로 이동할때도 내리는 구간이 되면 즉시 내려와야 하는데 안내려왔었음
3번째입니다
[Belt [durability=9, id=4, robot=true], Belt [durability=9, id=5, robot=false], Belt [durability=9, id=0, robot=true], Belt [durability=10, id=1, robot=false], Belt [durability=10, id=2, robot=false], Belt [durability=10, id=3, robot=false]]
회전시킨다
[Belt [durability=10, id=3, robot=false], Belt [durability=9, id=4, robot=true], Belt [durability=9, id=5, robot=false], Belt [durability=9, id=0, robot=true], Belt [durability=10, id=1, robot=false], Belt [durability=10, id=2, robot=false]]
이동시킨다
[Belt [durability=10, id=3, robot=false], Belt [durability=9, id=4, robot=false], Belt [durability=8, id=5, robot=true], Belt [durability=9, id=0, robot=false], Belt [durability=9, id=1, robot=true], Belt [durability=10, id=2, robot=false]]
싣는다
[Belt [durability=9, id=3, robot=true], Belt [durability=9, id=4, robot=false], Belt [durability=8, id=5, robot=true], Belt [durability=9, id=0, robot=false], Belt [durability=9, id=1, robot=true], Belt [durability=10, id=2, robot=false]]
0
실수 point1
절반 넘어가서도 로봇이 실려있는게 보인다. (하차할때 제대로 하차가 안되었었음)
이걸로 두 번째 테스트케이스까지 잡음
System.out.println("이동시킨다");
for(int i =N-1; i>=1; i--) {
if(!beltList.get(i).robot && beltList.get(i-1).robot && beltList.get(i).durability >=1) {
beltList.get(i-1).robot =false;
if(i == N-1) { //즉시 내린다.
beltList.get(i).robot =false;
}
beltList.get(i).durability -=1;
}
}
실수 point2
그리고 맨 위에 회전할때 내구성-1했던것도 빼니까 (안뺐었음 ㅠ)
→ 세 번째 테스트케이스까지 잡음
System.out.println("회전시킨다");
//즉시 내린다 내리는 위치에 있다면
if(beltList.get(N-1).robot == true) {
beltList.get(N-1).durability -=1; //여기가 문제 (실수 포인트)
beltList.get(N-1).robot = false;
}
실수 point3
다음으로 실수한 부분 실수 point1에서 예외처리해주고 i==N-1일때 그 다음 else를 안해줘서 이동이 안되었었음 그냥 로봇이 사라지고 끝남
System.out.println("이동시킨다");
for(int i =N-1; i>=1; i--) {
if(!beltList.get(i).robot && beltList.get(i-1).robot && beltList.get(i).durability >=1) {
beltList.get(i-1).robot =false;
if(i == N-1) { //즉시 내린다.
beltList.get(i).robot =false;
}else{//true로 해주는 거 어디감?
beltList.get(i).robot =true;
}
beltList.get(i).durability -=1;
}
}
→ 결국 문제를 조금 더 꼼꼼하게 읽고 경우의수를 따져보는 시뮬레이션 그림을 한 번 쭉 그려보고 시작하는게 좋다