유블로그

[Java] BOJ 20055 컨베이어 벨트 위의 로봇 본문

알고리즘

[Java] BOJ 20055 컨베이어 벨트 위의 로봇

yujeong kang 2021. 4. 24. 12:23

[Java] BOJ 20055 컨베이어 벨트 위의 로봇

 

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

 

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

public class BOJ_20055_컨베이어벨트위의로봇 {
	static class Block {
		int x;
		boolean isRobot;
		public Block(int x, boolean isRobot) {
			this.x = x;
			this.isRobot = isRobot;
		}
	}
	static int N, K;
	static Block[] A;
	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());
		A = new Block[N*2];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N*2; i++) {
			A[i] = new Block(Integer.parseInt(st.nextToken()), false);
		}
		
		System.out.println(solve());
	} // main
	
	private static int solve() {
		int ANSWER = 1;
		while(true) {
			if(isEnd()) break;
			
			// 1. 회전
			Block tmp = A[2*N-1];
			for (int i = 2*N-1; i > 0; i--) {
				A[i] = A[i-1];
			}
			A[0] = tmp;
			
			// 2. 로봇있다면 이동
			if(A[N-1].isRobot) A[N-1].isRobot = false;
			for (int i = N-2; i >= 0; i--) {
				if(!A[i].isRobot) continue;
				if(!A[i+1].isRobot && A[i+1].x > 0) {
					A[i+1].isRobot = true;
					A[i+1].x--;
					A[i].isRobot = false;
				}
			}
			if(isEnd()) break;
			if(A[N-1].isRobot) A[N-1].isRobot = false;
			
			// 3. 올라가는 위치에 로봇 없다면 로봇 올리기
			if(!A[0].isRobot && A[0].x > 0) {
				A[0].isRobot = true;
				A[0].x--;
			}
			if(isEnd()) break;
			
			ANSWER++;
		} // while
		
		return ANSWER;
	} // solve
	
	static boolean isEnd() {
		int cnt = 0;
		for (int i = 0; i < 2*N; i++) {
			if(A[i].x == 0) cnt++;
			if(cnt >= K) return true;
		}
		return false;
	}
}

 

처음에 문제를 이해한다고 실버문제치고 시간이 꽤 걸렸다... 하하

로봇을 건너편으로 보낸다는 게 땅에 도착하기만 하면 되는 건지.. 그리고 단계가 step의 개념인지 stage의 개념인지.. 그런.. 애매모호함.. 등등

 

어쨌든 문제가 시키는 대로만 진행하면 된다.

 

1, 2, 3 진행 하나를 1단계라고 하는 것이니 첫단계는 int ANSWER = 1;

각 1, 2, 3 과정 할 때 내구성 0 생기니까 계속 체크해주고 0이 K 이상되면 바로 끝내면 된다.

 

while 문을 돌면서

먼저 1. 회전 => 단지 1차원배열을 오른쪽으로 돌리는 일.

 

2. 로봇이 있다면 이동.

나는 배열을 0 ~ 2*N-1 로 잡아서

N-1 위치에 로봇이 있으면 내려갈 차례이니 robot 을 없애주었다.

그리고 N-2 부터 0 까지 하나씩 줄이면서 로봇이 있으면 다음 위치 로봇이 없고 내구성 1이상 일 때 옮겨주었다.

 

2번 하기 전, 후 땐 벨트 N-1위치에 있는 것들을 모두 false 시켜준다.

 

3. 로봇 올리기

배열 0 인덱스에서만 로봇을 올릴 수 있으니 0 인덱스에 로봇이 없는 상태이고 내구성 1 이상일 때 로봇 올린다.

'알고리즘' 카테고리의 다른 글

[Java] BOJ 19237 어른상어  (0) 2021.04.25
[Java] BOJ 19236 청소년상어  (0) 2021.04.24
[Java] BOJ 20056 마법사 상어와 파이어볼  (0) 2021.04.23
[Java] swea 1949 등산로조성  (0) 2021.04.22
[Java] swea 1952 수영장  (0) 2021.04.22