1. 문제
https://www.acmicpc.net/problem/20055
2. 풀이 과정
처음에 문제를 이해하는 게 제일 어려웠다.
결국 처음 풀 때는 문제를 완전히 이해하지 못하고 풀어 비효율적인 풀이였지만 통과는 했었다.
헷갈렸던 부분은 두 가지였다.
첫 번째는 컨베이어 벨트의 번호는 컨베이어 벨트가 회전할 때 같이 움직이는 것이고, 올리는 위치 내리는 위치는 그림 속처럼 시작점부터 0번째 N번째 위치를 의미한다.
두 번째는 로봇이 있을 수 있는 위치였다. 컨베이어 벨트가 회전 초밥처럼 타원형이 아니라 윗 라인에만 로봇을 둘 수 있는 형태이다.
푸는 건, 문제에서 순서대로 코드를 작성해주면 된다.
우선 컨베이어벨트의 내구도를 기록하는 배열, 윗 라인에 로봇이 있는지 여부를 기록할 배열 2개를 선언한다.1. 벨트를 for문을 이용해 한 칸씩 움직여준다.2. 벨트의 이동을 고려해 N-1, N-2번째에 있는 로봇을 내려준다.4. 로봇을 움직일 때, 앞단계에서 벨트가 이동한 한 칸을 고려해 이동할 수 있으면 2칸을 이동할 수 없으면 1칸을 움직이도록한다.5. 시작점에 로봇을 올릴 수 있으면 올린다.6. K가 0보다 작으면 종료한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, K, belt[]; //--K==0이면 종료
static boolean robots[];
public static int simulation(){
int step = 0;
while(K > 0){
step ++;
//1
int temp = belt[2*N-1];
for(int i=2*N-1; i>0; i--){
belt[i] = belt[i-1];
}
belt[0] = temp;
//2
robots[N-1] = robots[N-2] = false;
for(int i=N-1; i>1 ; i--){
if(!robots[i-2] || robots[i] || belt[i] <= 0){
if(robots[i-2]){
robots[i-1] = true;
robots[i-2] = false;
}
continue;
}
robots[i] = true;
robots[i-2] = false;
if(--belt[i] == 0){
K--;
}
}
//3
if(!robots[0] && belt[0] > 0){
robots[0] = true;
if(--belt[0] == 0){
K--;
}
}
}
return step;
}
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());
belt = new int[2*N];
robots = new boolean[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<2*N; i++){
belt[i] = Integer.parseInt(st.nextToken());
}
System.out.println(simulation());
}
}
결과
'코딩문제풀이 > Baekjoon' 카테고리의 다른 글
[Java] 백준 14890번 : 경사로 (0) | 2023.01.03 |
---|---|
[Java] 백준 2251번 : 물통 (0) | 2023.01.02 |
[Java] 백준 2751번 : 수 정렬하기 2 (0) | 2022.12.31 |
[Java] 백준 2310번 : 어드벤처 게임* (0) | 2022.12.30 |
[Java] 백준 21924번 : 도시 건설 (0) | 2022.12.29 |