[백준 - 20055] 실버1 - 컨베이어 벨트 위의 로봇
알고리즘/백준

[백준 - 20055] 실버1 - 컨베이어 벨트 위의 로봇

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

1. 유형

구현

 

2. 풀이

  • 로봇 배열, 내구도 배열 지정
  • 규칙 순서대로 진행

규칙에는 안나와 있는거 같은데, 상식적으로 처음에 컨베이어 벨트 한칸 이동시

 

벨트 위에 있는 로봇 또한 같이 움직이는 걸 생각해 주자.

 

 

3. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int N, K, list[], robot[];

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		N = Integer.valueOf(st.nextToken());
		K = Integer.valueOf(st.nextToken());
		st = new StringTokenizer(in.readLine(), " ");
		list = new int[2 * N];
		robot = new int[N];// 1이 존재하는거
		for (int i = 0; i < 2 * N; i++) {
			list[i] = Integer.valueOf(st.nextToken());
		}
		int turn = 0;
		out:while (true) {
			turn++;
			// 한칸씩 이동
			int tmp = list[(2 * N) - 1];
			for (int i = (2 * N) - 1; i >= 1; i--) {
				list[i] = list[i - 1];
			}
			list[0] = tmp;
			
			// 로봇도 벨트에 따라 이동
			for (int i = N - 1; i >= 1; i--) {
				robot[i] = robot[i - 1];
			}
			robot[0]=0;
			// 로봇 한칸 이동
			for (int i = N - 1; i >= 0; i--) {
				if(i==N-1) {
					robot[i]=0;
					continue;
				}
				if (robot[i] == 1 && robot[i + 1] == 0 && list[i + 1] > 0) {
					robot[i] = 0;
					robot[i + 1] = 1;
					list[i+1]--;
				}
			}
			//처음에 로봇하나 올리기
			if(list[0]>0 && robot[0]==0) {
				list[0]--;
				robot[0]=1;
			}
			//내구도 판단
			int cnt=0;
			for(int i=0; i<2*N; i++) {
				if(list[i]==0) {
					cnt++;
				}
				if(cnt>=K) {
					break out;
				}
			}
		}
		System.out.println(turn);
	}
}

4. 느낀점

문제를 잘 읽고 빠르게 이해를 해야겠다.

 

글 해독력을 향상시켜야 한다