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

비가츄·2022년 8월 23일
0

문제 설명

문제 링크는 여기.

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

접근

문제에서 주어진 조건대로 코드를 짜면 되는 것이었다.

처음 짤 때는 왜 중간에 혼자 변형해서 코드를 작성했는지 모르겠다…

  1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
    1. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
  3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
  4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.

종료되었을 때 몇 번째 단계가 진행 중이었는지 구해보자. 가장 처음 수행되는 단계는 1번째 단계이다.

// 로봇 추가 위치
int input = 0;
// 로봇 제거 위치
int output = N/2-1;
// 시도 횟수
int ans = 1;
// 빈칸
int blank = 0;

while(true) {
	// 한칸 회전
	input = (input+N-1)%N;
	output = (output+N-1)%N;
	
	// 제거 위치에 있으면 일단 삭제
	robot[output] = false;
	// 로봇 먼저 둔 순서대로 이동 시도
	for(int i=1; i<N/2; i++) {
		int n = (output+N-i)%N;
		int m = (n+1)%N;
		// 옮길 로봇이 있고
		if(robot[n]) {
			// 앞에 로봇이 없으며 벨트 내구도가 남아있다면
			if(!robot[m] && balt[m]>0) {
				robot[n] = false;
				belt[m]--;
				// 내구도 바닥나면 표시
				if(belt[m]==0) blank++;
				// 탈출구 아니면 전진
				if(output!=m)
					robot[m] = true;
			}
		}
	}
	
	// 벨트에 로봇 올릴 수 있으면 올리기
	if(belt[input]>0) {
		robot[input] = true;
		belt[input]--;
		// 내구도 바닥나면 표시
		if(balt[input]==0) blank++;
	}
	
	if(blank>=K) break;
	ans++;
}

소스코드

최종 제출한 코드는 다음과 같다.

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

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken())*2;
		int K = Integer.parseInt(st.nextToken());
		int[] belt = new int[N];
		boolean[] robot = new boolean[N];
		
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++) {
			belt[i] = Integer.parseInt(st.nextToken());
		}
		
		int input = 0;
		int output = N/2-1;
		int ans = 1;
		int blank = 0;
		while(true) {
			// 한칸 회전
			input = (input+N-1)%N;
			output = (output+N-1)%N;
			
			robot[output] = false;
			for(int i=1; i<N/2; i++) {
				int n = (output+N-i)%N;
				int m = (n+1)%N;
				// 옮길 로봇이 있고
				if(robot[n]) {
					// 앞에 로봇이 없으며 벨트 내구도가 남아있다면
					if(!robot[m] && belt[m]>0) {
						robot[n] = false;
						belt[m]--;
						// 내구도 바닥나면 표시
						if(belt[m]==0) blank++;
						// 탈출구 아니면 전진
						if(output!=m)
							robot[m] = true;
					}
				}
			}
			
			// 벨트에 로봇 올릴 수 있으면 올리기
			if(belt[input]>0) {
				robot[input] = true;
				belt[input]--;
				// 내구도 바닥나면 표시
				if(belt[input]==0) blank++;
			}
			
			if(blank>=K) break;
			ans++;
		}
		System.out.println(ans);
	}
}

결과

고찰

문제 지문을… 잘 읽자…^^

profile
오엥

0개의 댓글