
내가 생각했을때 문제에서 원하는부분
첫째 줄에 N, K가 주어진다. 둘째 줄에는 A1, A2, ..., A2N이 주어진다.
몇 번째 단계가 진행 중일때 종료되었는지 출력한다.
내가 이 문제를 보고 생각해본 부분
durability 배열은 벨트 각 칸의 내구도를 저장한다.
길이는 2N이다.
robots 배열은 로봇 존재 여부를 저장하는데 길이는 N이다.
로봇은 오직 올리는 위치(0)부터 내리는 위치(N - 1)까지 위에서만 존재한다.
벨트 회전 시 내구도 배열을 한 칸씩 오른쪽으로 밀고, 로봇 위치도 한 칸씩 이동시키며 내리는 칸에서 내린 로봇은 제거합니다.
로봇 이동은 내리는 위치 바로 전 칸부터 역순으로 탐색하며 가능하면 1칸 앞으로 이동시킵니다. 이동하면 내구도가 1 줄고, 내리는 칸에 도착하면 바로 내립니다.
올리는 위치 로봇 올리기는 내구도가 남아 있을 때만 올리고 내구도를 깎습니다.
종료 조건은 내구도가 0인 칸이 K 이상이면 현재 단계를 출력하고 종료합니다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 20055번 문제
public class Main1338 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] durability = new int[2 * N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 2 * N; i++) {
durability[i] = Integer.parseInt(st.nextToken());
}
boolean[] robots = new boolean[N]; // 로봇은 올리는 위치(0번부터 N-1번 칸만 관리)
int step = 0;
while (true) {
step++;
// 1. 벨트와 로봇 한 칸 회전
// 벨트 회전
int lastDurability = durability[2 * N -1];
System.arraycopy(durability, 0, durability, 1, 2 * N -1);
durability[0] = lastDurability;
// 로봇 회전 (오른쪽으로 한 칸 이동)
for (int i = N - 1; i > 0; i--) {
robots[i] = robots[i - 1];
}
robots[0] = false; // 올리는 위치에 새로 올라갈 수 있으니 초기화
robots[N - 1] = false; // 내리는 위치에 도착하면 내림
// 2. 로봇이 한 칸씩 이동
for (int i = N - 2; i >= 0; i--) {
if (robots[i] && !robots[i + 1] && durability[i + 1] > 0) {
robots[i] = false;
if (i + 1 != N - 1) { // 내리는 위치가 아니면 이동
robots[i + 1] = true;
}
durability[i + 1]--;
}
}
robots[N - 1] = false; // 내리는 위치 도착시 로봇 내림
// 3. 올리는 위치에 로봇 올리기 (내구도 0 아니면)
if (durability[0] > 0) {
robots[0] = true;
durability[0]--;
}
// 4. 내구도 0인 칸 개수 세기
int zeroDurabilityCount = 0;
for (int i = 0; i < 2 * N; i++) {
if (durability[i] == 0) zeroDurabilityCount++;
}
if (zeroDurabilityCount >= K) {
System.out.println(step);
break;
}
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.