최코딩의 개발
[백준] 컨베이어 벨트 위의 로봇 20055번(🥇골드5) 본문
사이트
https://www.acmicpc.net/problem/20055
문제


분석
문제만 잘이해한다면 어렵지 않은 문제다!!
이해하는데만 30분걸림.. 제대로 안읽어서 ㅜㅜㅜ
문제의 핵심은 내구도이다!!
문제의 이해를 돕기 위해 아래를 참고해보자
이해
입력 부분: n은 컨테이너 가로 칸 갯수, k는 내구도가 0인 칸(조건) ex) 만약 내구도가 0인 칸이 k개 이상이면 종료!!
마지막으로 두번째 입력부분은 n*2개 칸의 내구도를 입력하는 부분이다.
3 2
1 2 1 2 1 2
입력은 위와 같이 받을것이다!!
참고로 두번째 입력부분에서 1 2 1 2 1 2 이렇게 입력받는데 실제 그림은
1 2 1
2 1 2 이다. 음 다시 말해서 만약 1 2 3 4 5 6 이렇게 입력받으면 실제 그림은
1 2 3
6 5 4 라는 것이다! 필자는 이렇게 구현함! 즉 헷갈리지 말자! (이따 코드에서 볼거임)

자 그럼 문제 이해는 위 사진을 참고하면 될것이다.!!
참고로 칸이
1 2 3
6 5 4 가 있으면 로봇을 올리는 칸은 1이며, 로봇을 내리는 칸은 3이다!!! 주의!! 필자는 6이 내리는 칸인줄..
코드
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[n * 2];
robot = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
for (int i = n * 2 - 1; i > n - 1; i--) {
arr[i] = Integer.parseInt(st.nextToken());
}
여기는 입력을 받는 부분이다.
필자가 앞서 말했듯이 n번째 즉 절반 이 후 부터는 거꾸로 저장을 해야 되기때문에 위와 같이 하였다.
이제 solution 함수를 호출해주고 while 문으로 들어온다.
1번 조건
// 컨베이트 벨트 이동
int u_temp = arr[n - 1];
int d_temp = arr[n];
for (int i = n - 2; i >= 0; i--) {
arr[i + 1] = arr[i];
}
for (int i = n; i < 2 * n - 1; i++) {
arr[i] = arr[i + 1];
}
arr[0] = d_temp;
arr[n * 2 - 1] = u_temp;
1번 조건에 따라 컨베이너 벨트가 이동한다.
이때 주의할점은 맨 끝에서부터 옮겨야된다. 그래야지 중간값이 분실이 안된다.
// 컨베이트 벨트에서 로봇도 이동
for (int i = n - 2; i >= 0; i--) {
if (robot[i] != 0) {
robot[i + 1] = robot[i];
robot[i] = 0;
}
}
컨베이너 벨트도 이동했으므로 동시에 그 위에 로봇도 있으면 같이 이동한다.
2번 조건
// n번째 로봇 퇴출
robot[n - 1] = 0;
//로봇 자체적으로 한칸이동
for (int i = n - 2; i >= 0; i--) {
if (robot[i] != 0 && robot[i + 1] == 0 && arr[i + 1] > 0) {
robot[i + 1] = robot[i];
robot[i] = 0;
arr[i + 1] -= 1;
}
}
2번 조건에 따라 로봇이 자체적으로 한 칸 이동함과 동시에 n번째 자리에 오면 0으로 만들어 퇴출 시켜버린다.
또한 이동하는 칸의 내구가 1이상일때만 움직일 수 있으므로 위와같이 if문으로 조건을 걸어 두었다.
3번 조건
// 로봇 탑승
if (arr[0] > 0 && robot[0] == 0) {
arr[0] -= 1;
robot[0] = 1;
}
3번 조건에 따라 로봇을 탑승시킨다.
이때 올리는 칸에 로봇이 있거나 동시에 내구도가 0일시 탑승을 못하는 if문 조건을 걸어 두었다.
4번 조건
int strong = 0;
for (int i : arr) {
if (i <= 0) {
strong++;
}
}
if (strong >= k) {
a = false;
}
4번 조건이다. 조건 k가 만족할때 while 을 false로 만든 뒤 변수 level 값 출력!!
전체코드
package implement;
import java.util.*;
import java.io.*;
public class Implement20055 {
static int n;
static int k;
static int[] arr;
static int level = 0;
static int[] robot;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[n * 2];
robot = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
for (int i = n * 2 - 1; i > n - 1; i--) {
arr[i] = Integer.parseInt(st.nextToken());
}
solution();
System.out.println(level);
}
private static void solution() {
boolean a = true;
while (a) {
level++;
// 컨베이트 벨트 이동
int u_temp = arr[n - 1];
int d_temp = arr[n];
for (int i = n - 2; i >= 0; i--) {
arr[i + 1] = arr[i];
}
for (int i = n; i < 2 * n - 1; i++) {
arr[i] = arr[i + 1];
}
arr[0] = d_temp;
arr[n * 2 - 1] = u_temp;
// 컨베이트 벨트에서 로봇도 이동
for (int i = n - 2; i >= 0; i--) {
if (robot[i] != 0) {
robot[i + 1] = robot[i];
robot[i] = 0;
}
}
// n번째 로봇 퇴출
robot[n - 1] = 0;
//로봇 자체적으로 한칸이동
for (int i = n - 2; i >= 0; i--) {
if (robot[i] != 0 && robot[i + 1] == 0 && arr[i + 1] > 0) {
robot[i + 1] = robot[i];
robot[i] = 0;
arr[i + 1] -= 1;
}
}
// 로봇 탑승
if (arr[0] > 0 && robot[0] == 0) {
arr[0] -= 1;
robot[0] = 1;
}
int strong = 0;
for (int i : arr) {
if (i <= 0) {
strong++;
}
}
if (strong >= k) {
a = false;
}
}
}
}
결과

느낀점
오랜만에 한번에 맞힌 골드 문제다!! 처음에 문제 이해가 안되서 고민을 많이 했다... 단계 기준을 어디서 시작해야되는지,.
그치만 문제에 다 적혀있었다... 역시 코테는 구현하고 그래프 문제가 가장 쉬운거 같다!
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 지름길 1446번 (🥈실버1) (0) | 2024.06.06 |
---|---|
[백준] A와 B 2 12919번(🥇골드5) (0) | 2024.05.29 |
[백준] KCPC 3758번(🥈실버2) (0) | 2024.05.07 |
[백준] 사탕 게임 3085번 (🥈실버2) (0) | 2024.05.02 |
[백준] 숨바꼭질4 13913번 (🥇골드4) (0) | 2024.04.09 |