본문 바로가기
Problem Solving/삼성 SW 역량 테스트 기출

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

by Libi 2021. 8. 6.
반응형

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

 

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

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

www.acmicpc.net

[ 문제풀이 ]

단순 시뮬레이션 문제이다. 주어진 조건을 순서대로 구현한다면 쉽게 정답을 맞힐 수 있을 것이다.

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

public class Main {

	static int N, K, beltSize;
	static int[] belt;
	static boolean[] 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());
		beltSize = N << 1;
		belt = new int[beltSize];
		robot = new boolean[N];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < beltSize; ++i) {
			belt[i] = Integer.parseInt(st.nextToken());
		}

		int time = 0;
		while (true) {
			time++;
			//벨트를 한 칸 회전한다. 벨트 위에 있는 로봇도 같이 움직여준다.
			moveTheBelt();
			//N-1부터 0까지의 벨트 위의 로봇을 이동이 가능하면 이동시켜준다.
			moveTheRobot();
			//0번 벨트에 로봇이 없고 내구도가 1이상이면 로봇 1개를 올려준다.
			if (isValid()) {
				robot[0] = true;
				belt[0]--;
			}
			//내구도 0인 벨트가 K개 이상이면 종료한다.
			if (getZeroBelt()) {
				break;
			}
		}
		System.out.println(time);
	}

	public static void moveTheBelt() {
		//로봇을 한 칸씩 앞으로 이동
		for (int i = N - 2; i >= 0; --i) {
			robot[i + 1] = robot[i] ? true : false;
		}
		robot[0] = false;

		//벨트도 한 칸씩 앞으로 이동
		int temp = belt[0];
		for (int i = beltSize - 1; i > 0; --i) {
			belt[(i + 1) % beltSize] = belt[i];
		}
		belt[1] = temp;
	}

	public static void moveTheRobot() {
		robot[N - 1] = false;
		for (int i = N - 2; i >= 0; --i) {
			if (robot[i] && !robot[i + 1] && belt[i + 1] >= 1) {
				robot[i] = false;
				robot[i + 1] = true;
				belt[i + 1]--;
			}
		}
	}

	public static boolean isValid() {
		return belt[0] >= 1 && !robot[0];
	}
	
	public static boolean getZeroBelt() {
		int cnt = 0;
		for (int i = 0; i < beltSize; ++i) {
			if (belt[i] == 0) {
				cnt++;
			}
		}
		return cnt >= K;
	}
}

 

 

반응형

댓글