1. 문제
2. 접근방법
시뮬레이션 문제
벨트의 체력 배열 [N*2]
로봇 유무 배열 [N]
1. 벨트가 회전한다 (로봇도 같이 이동 - N번째 자리에 도착한 로봇 삭제)
2. 로봇이 이동한다 (N-1부터 검사 검사 자리에 로봇이 있고 그 다음 자리에 로봇이 없고 다음자리 체력이 0보다 크다면 이동하고 체력을 깍는다.)
3. 로봇을 올린다 (0번째 자리에 로봇이 없고 체력이 0보다 크다면 올리고 체력을 깍는다.)
4. 지금까지 체력을 깍아서 0이 된 자리가 K개 이상이면 종료.
5. 1 - 4 반복 시켜서 종료 됐을 때 반복 횟수 출력
3. 자바 코드
package Silver;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P20055컨베이어벨트위의로봇 {
static int N,K;
static int health[];
static boolean robot[];
static int cnt, Rbreak;
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());
health = new int[N*2];
cnt = 0;
robot = new boolean[N];
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < N *2 ; i++)
health[i] = Integer.parseInt(st.nextToken());
while(true) {
cnt++;
rotate();
robotmove();
putonRobot();
if(Rbreak >= K)
break;
}
System.out.println(cnt);
}
static void rotate() {
int pre = health[N*2-1];
for(int i = 0 ; i < N*2 ; i++) {
int now = health[i];
health[i] = pre;
pre = now;
}
for(int i = N-2 ; i >= 0 ; i--)
robot[i+1] = robot[i];
robot[0] = false;
robot[N-1] = false;
}
static void robotmove() {
for(int i = N-1 ; i >= 0 ; i-- ) {
if(robot[i] && !robot[i+1] && health[i+1] != 0) {
robot[i] = false;
robot[i+1] = true;
health[i+1] -=1;
if(health[i+1] == 0)
Rbreak++;
}
}
robot[N-1] = false;
}
static void putonRobot() {
if(health[0] != 0) {
robot[0] = true;
health[0]--;
if(health[0] == 0)
Rbreak++;
}
}
}
4. 마치며
문제 설명이 개떡 같았지만
나쁘지 않은 시뮬문제
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 2056 작업 (0) | 2021.02.03 |
---|---|
[백준] 13460 구슬 탈출2 (0) | 2021.02.03 |
[백준] 4179 불! (0) | 2021.01.29 |
[백준] 3019 테트리스 (0) | 2021.01.24 |
[백준] 15661 링크와 스타트 (3) | 2021.01.24 |