// [input]
3 2
1 2 1 2 1 2
// [output]
2
주어진 환경에서 여러 작업을 순차적으로 실행
상태 변화와 규칙에 따라 동작을 구현
// [input]
// [logic]
// 로봇의 배열 & 스텝수 정의
boolean[] robots = new boolean[N];
int step = 0;
while(true) {
// 스텝 수 증가
step ++;
// 1. 벨트 회전 -> 내구도, 로봇 배열 변화
// 2. 회전 후 로봇의 이동 조건 확인 -> 이동 가능하다면 & 이동 후 로봇의 위치 & 내구도 처리
// 3. 로봇 올리기 조건 확인
// 4. 종료 조건 확인 -> break를 통해 while문 탈출
}
// [output]: step 수 출력
int last = belt[2*N-1];
System.arraycopy(belt, 0, belt, 1, 2*N-1); // System.arraycopy(src,srcPos,dest,destPost, length)
belt[0] = last;
boolean[] newRobots = new boolean[N];
for(int i=0; i<N-1; i++) newRobots[i+1] = robots[i];
robots = newRobots;
robots[N-1] = false; // 마지막 위치에 오면 내림
for(int i=N-2; i>=0; i--){
if(robots[i] && !robots[i+1] && belt[i+1]>0){
robots[i]=false;
robots[i+1]=true;
belt[i+1]--;
}
}
robots[N-1] = false;
if(belt[0]>0 && !robots[0]){
robots[0]=true;
belt[0]--;
}
int zeroCount = 0;
for(int val : belt) if(val==0) zeroCount++;
if(zeroCount >= K) break;
public class Main {
static int N,K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
// [input]
String[] tmp = br.readLine().split(" ");
N = Integer.parseInt(tmp[0]);
K = Integer.parseInt(tmp[1]);
// 0-based
String[] temp = br.readLine().split(" ");
int[] belt = new int[2*N];
for(int i=0; i<N*2; i++) {
belt[i] = Integer.parseInt(temp[i]);
}
// [logic]
boolean[] robots = new boolean[N];
int step = 0;
while(true){
step++;
// 1. 벨트 회전
int last = belt[2*N-1];
System.arraycopy(belt, 0, belt, 1, 2*N-1); // System.arraycopy(src,srcPos,dest,destPost, length)
belt[0] = last;
boolean[] newRobots = new boolean[N];
for(int i=0; i<N-1; i++) newRobots[i+1] = robots[i];
robots = newRobots;
robots[N-1] = false; // 마지막 위치에 오면 내림
// 2. 로봇 이동
for(int i=N-2; i>=0; i--){
if(robots[i] && !robots[i+1] && belt[i+1]>0){
robots[i]=false;
robots[i+1]=true;
belt[i+1]--;
}
}
robots[N-1] = false;
// 3. 로봇 올리기
if(belt[0]>0 && !robots[0]){
robots[0]=true;
belt[0]--;
}
// 4. 종료 조건
int zeroCount = 0;
for(int val : belt) if(val==0) zeroCount++;
if(zeroCount >= K) break;
}
// 출력
System.out.println(step);
}
}
System.arraycopy(src,srcPos,dest,destPost, length) ) // 배열을 오른쪽으로 1칸 회전
int last = deque.removeLast(); // 마지막 요소 제거
deque.addFirst(last); // 마지막 요소를 첫 번째로 추가
// 배열을 왼쪽으로 1칸 회전
int first = deque.removeFirst(); // 첫 번째 요소 제거
deque.addLast(first); // 첫 번째 요소를 마지막으로 추가
로봇의 이동은 벨트가 회전한 후 뒤에서 앞으로 이동해야 하므로 for문을 뒤에서부터 작성해야 함
뒤에서부터 처리해야 하는 이유?
앞에서부터 처리할 경우 이미 이동한 로봇을 덮어쓰게 되어 로봇이 이동하지 않는 오류가 발생
O(N))System.arraycopy(belt, 0, belt, 1, 2*N-1)를 사용한 배열의 회전 O(N))O(1))O(N))⇒ 각 시뮬레이션 단계에서 수행하는 연산은 최대 O(N) 시간이 걸림
시뮬레이션을 최대 K번 반복해야 하기 때문에, 전체 시간 복잡도는 O(N * K)
이 코드에서 잘못된 부분이나 개선할 점이 있다면 언제든지 댓글로 알려주세요.
알고리즘을 작성하면서 더 좋은 코드를 만들 수 있도록 도와주시면 정말 감사하겠습니다! 🙂