Coding Test/baekjoon

[백준 20055] 컨베이어 벨트 위의 로봇- java (solved.ac - 골드 5)

조용장 2022. 9. 18. 16:00

https://www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

풀이

문제를 보았을 때 알 수 있는 힌트

이러한 구현 문제는 완벽하게 구현만 하면 된다.

그전에 설계를 위해 조건을 잘 찾고 어떤 자료형을 쓸 것 인지 잘 파악하는 것도 중요하다.

처음에 문제를 읽고 이해하는데 시간이 많이 걸렸다. 

하지만 조건은 간단하였다.

벨트와 로봇이 있고 벨트는 해번 한번 움직이고 로봇을 위에 올라가서 앞으로 전진할수있다는 것!

이제 조건을 정리 하였다.

1. 벨트가 각 한칸씩 움직인다. 이때 로봇에 위에 있다면 같이 앞으로 움직이게 될것이다.

2. 가장 먼저 벨트에 올라간(오른쪽에 있는) 로봇부터, 벨트가 회전하는 방향(오른쪽)으로 한칸 이동한다.

 -  하지만 벨트의 내구도가 없는 경우, 앞에 로봇이 있는 경우 움직이지 않는다.

 -  그리고 움직이게 된다면 벨트의 내구도가 1개 줄어든다.

 -  줄어들고 나서 0이 된다면 마모된 벨트의 개수를 파악해준다.

3. 올리는 위치(첫번쨰 자리)에 있는 칸의 내구도가 0이 아니면 로봇을 올려준다.

 -  이때 로봇을 올렸다면 내구도 1이 줄어든다.

 -  줄어들고 나서 0이 된다면 마모된 벨트의 개수를 파악해준다.

4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않으면 1번을 다시 수행한다.

이렇게 4번을 1단계라고 하며 총 몇 단계인지를 확인한다.

 

package baekjoon20055;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	static int n,k,zeroCount,result;
	static Stack<Integer> n_list = new Stack<>();
	static ArrayList<Integer> robot_list = new ArrayList<>();
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer token = new StringTokenizer(br.readLine());
		n = Integer.parseInt(token.nextToken());
		k = Integer.parseInt(token.nextToken());
		zeroCount = 0;
		result=1;
		token = new StringTokenizer(br.readLine());
		for (int i = 0; i < n*2; i++) {
			n_list.add(Integer.parseInt(token.nextToken()));
		}
		for (int i = 0; i < n; i++) {
			robot_list.add(0);
		}
		
		for (;;) { // 조건 4
			// 조건 1
			// 벨트 이동
			n_list.add(0, n_list.pop());
			// 같이 로봇도 이동
			robot_list.remove(n-1); // 끝에 있는 값 제거
			robot_list.add(0,0); // 처음 값 넣기
			robot_list.set(n-1, 0); // 이동한 마지막 값 0으로 변경
			
			// 조건 2 - 로봇이 움직여서 앞으로 이동
			for (int i = n-2; i >=0; --i) {
				if(robot_list.get(i)!=0) {
					if(robot_list.get(i+1)==1) continue;
					if(n_list.get(i+1)==0) continue;
					robot_list.set(i+1, 1); // 앞으로 이동
					robot_list.set(i, 0); // 현재 값 0으로 변경
					n_list.set(i+1, n_list.get(i+1)-1); // 값 1개 줄이기
					if(n_list.get(i+1)==0) {
						zeroCount++;
					}
				}
			}
			// 조건 3 - 로봇 올리기
			if(n_list.get(0)!=0) {
				robot_list.set(0, 1); // 로봇 올림
				n_list.set(0, n_list.get(0)-1); // 값 1개 줄이기
				if(n_list.get(0)==0) {
					zeroCount++;
				}
			}
			
//			System.out.println(n_list);
//			System.out.println(robot_list);
			if(zeroCount>=k) {
				break;
			}
			else {
				result++;
			}
			
		}
		
		System.out.println(result);

	}

}

https://github.com/dydwkd486/coding_test/blob/main/baekjoon/java/baekjoon20055/Main.java

 

GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리

코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.

github.com