문제 링크
조건
- N : 벨트 한 쪽 면 길이 (2 <= N <= 100)
- K : 내구도 0인 개수 limit
- A[] : 내구도 배열 (1 <= Ai <= 1000)
접근 방법
- strong[] : 1 ~ 2*N 위치까지 벨트의 내구도 점수 저장
- robot[] : 1 ~ 2*N 위치까지 벨트 위에 로봇 존재 여부 저장
- 동작 과정
- 벨트는 +1 방향으로 한 칸 회전 ( sp -startpoint- 와 ep -endpoint- 를 각각 -1씩 해줌)
- 바뀐 ep에 robot이 있는 경우 내려줄 것!
- ep -> sp 순으로(가장 먼저 벨트에 올라간 로봇부터) 로봇 위치 +1
- 이동할 위치에 로봇이 없고, 내구도가 1 이상이어야 함
- 로봇이 이동한 위치가 ep일 경우 내려줄 것!
- 이동한 위치의 벨트 내구도가 0이 됐으면 K--
- sp위치에 새로운 로봇 올려줌
- sp위치에 로봇이 없고, 내구도가 1 이상이어야 함
- 올린 위치의 벨트 내구도가 0이 됐으면 K--
- K > 0 이라면 위 과정 반복
솔루션
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, K;
static int[] strong;
static boolean[] robot;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
int len = N * 2;
strong = new int[len + 1];
st = new StringTokenizer(br.readLine().trim(), " ");
for(int i = 1; i < len+1; i++) {//내구도 입력
strong[i] = Integer.parseInt(st.nextToken());
}
robot = new boolean[len + 1];
int sp = 1;
int ep = N;
int level = 0;
while(K > 0) {
level++;
//1. 벨트 이동
if(--sp == 0) sp = len;
if(--ep == 0) ep = len;
if(robot[ep]) {//내려가는 위치 도착하면 로봇 내려줌
robot[ep] = false;
}
//2. ep -> sp 순으로 로봇 위치 +1
int cur = ep;
while(cur != sp) {
if(robot[cur]) {
int next = cur == len ? 1 : cur+1;
if(!robot[next] && strong[next] > 0) {//이동 위치에 로봇 없고 내구도 0 이상
robot[cur] = false;
if(next != ep) robot[next] = true;///////// 내려가는 위치에 도착하면 로봇 바로 내려줌!! //////////
if(--strong[next] == 0) K--;
}
}
if(--cur == 0) cur = len;
}
//3. sp에 로봇 없으면 올림
if(!robot[sp] && strong[sp] > 0) {
robot[sp] = true;
if(--strong[sp] == 0) K--;
}
}
System.out.println(level);
}
}
리뷰
- 로봇이 한 칸씩 이동 후 ep에 도착한 로봇은 바로 내려주는 작업을 까먹어 한참 헤맴
- 시뮬은 꼼꼼하게 주어진 조건 확인해서 적용하는 게 중요함..