BOJ - 20055 컨베이어 벨트 위의 로봇

leehyunjon·2022년 6월 13일
0

Algorithm

목록 보기
67/162

20055 컨베이어 벨트 위의 로봇 : https://www.acmicpc.net/problem/20055


Problem


Solve

주어진 조건

  • N : 컨베이어 벨트 길이, K : 컨베이어 벨트 내구도
  • 컨베이어 벨트[0] : 올리는 위치, 컨베이어 벨트[N-1] : 내리는 위치
  • 로봇을 컨베이어 벨트에 올리거나 이동하면 해당 위치의 컨베이어 벨트의 내구도는 1감소
  • 내구도가 0이라면 벨트에 로봇을 올리거나 이동할수 없다
  • 내구도 0인 벨트가 K개 이상이라면 종료

로봇을 옮기는 과정은 아래와 같다.

  1. 벨트와 벨트 위에 있는 로봇은 한칸 회전한다.
  2. 가장 먼저 올라간 로봇 부터 벨트가 회전하는 방향으로 이동한다.
    • 이동할 벨트의 내구도가 0이거나 로봇이 있다면 이동할수 없다.
    • 내구도가 1이라면 이동할수 있다.
  3. 올리는 위치(컨베이어벨트[0])의 내구도가 0이 아니라면 로봇을 올린다.
  4. 내구도 0의 개수가 K개 이상이라면 종료한다.

Code

public class 컨베이어벨트위의로봇 {
	static int N;
	static int K;
	static int[] belt;
	static int[] durability;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
        //벨트의 총 길이 2N
		belt = new int[N*2];
        //벨트의 내구도 길이 2N
		durability = new int[N*2];
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < 2*N; i++) {
			durability[i] = Integer.parseInt(st.nextToken());
		}

		int answer = move();

		bw.write(String.valueOf(answer));
		bw.flush();
		bw.close();
	}

	//로봇을 옮기는 과정
	static int move() {
		int turn = 1;

		while (true) {

			//1번 과정 : 벨트 회전
			moveBelt();

			//2번 과정 : 로봇 이동
			moveRobot();

			//3번 과정 : 로봇을 올리는 위치에 올리기
			setRobot();

			//4번 과정 : 내구도 0인 개수가 K개 이상인가
			if (check())
				break;

			turn++;
		}

		return turn;
	}

	//컨베이어 벨트 마지막에 있는 값과 내구도는 회전 후 첫번째에 위치
	static void moveBelt() {
		int b = belt[2*N - 1];
		int d = durability[2*N - 1];
		for (int i = 2*N - 1; i > 0; i--) {
			belt[i] = belt[i - 1];
			durability[i] = durability[i - 1];
		}
		belt[0] = b;
		durability[0] = d;
        //N-1은 내리는 위치 이므로 무조건 0
		belt[N - 1] = 0;
	}

	static void moveRobot() {
		for (int i = N - 1; i > 0; i--) {
        	//이동할 로봇이 없다면 다음 벨트 확인
			if (belt[i - 1] == 0)
				continue;
			//먼저 올린 로봇 순으로 다음 이동할 곳의 내구도가 0이 아니고 로봇이 없는 경우만 이동            
			if (belt[i] == 0 && durability[i] > 0) {
				belt[i] = belt[i - 1];
				belt[i - 1] = 0;
				durability[i]--;
			}
		}
        //N-1은 내리는 위치 이므로 무조건 0
		belt[N-1] = 0;
		// belt[0] = 0;
	}

	//올리는 위치에 로봇 올리기
	static void setRobot() {
		if (belt[0] == 0 && durability[0] > 0) {
			belt[0] = 1;
			durability[0]--;
		}
	}

	//내구도 0인 개수가 K개 이상인가
	static boolean check() {
		int count = 0;
		for (int d : durability) {
			if (d == 0) {
				count++;
			}
		}

		return count >= K;
	}
}

Result

문제를 제대로 읽지않고 맞왜틀 해버렸다.
내리는 위치는 N이다. (2*N)-1 이 아니라..


Reference

https://velog.io/@dot2__/BOJ-20055%EB%B2%88-%EC%BB%A8%EB%B2%A0%EC%9D%B4%EC%96%B4-%EB%B2%A8%ED%8A%B8-%EC%9C%84%EC%9D%98-%EB%A1%9C%EB%B4%87-Java

profile
내 꿈은 좋은 개발자

0개의 댓글