Seren dev's blog
article thumbnail

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

 

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

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

www.acmicpc.net

1. 풀이

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

 

2. 전체 코드

<java />
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); int[] a = new int[2*n]; boolean[] robot = new boolean[n]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < 2 * n; i++) { a[i] = Integer.parseInt(st.nextToken()); } int zero_count = 0; int step = 0; while (zero_count < k) { step++; // 1단계: 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다. int temp = a[2*n-1]; for (int i = 2*n-1; i > 0; i--) { a[i] = a[i-1]; } a[0] = temp; for (int i = n-1; i > 0; i--) { robot[i] = robot[i-1]; } robot[0] = false; // 로봇이 내리는 위치에 도달하면 그 즉시 내린다. robot[n-1] = false; // 2단계: 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다. for (int i = n-2; i >= 0; i--) { if (robot[i] && a[i+1] > 0 && !robot[i+1]) { robot[i] = false; robot[i+1] = true; a[i+1]--; if (a[i+1] == 0) { zero_count++; } } } // 로봇이 내리는 위치에 도달하면 그 즉시 내린다. robot[n-1] = false; // 3단계: 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다. if (a[0] > 0) { robot[0] = true; a[0]--; if (a[0] == 0) { zero_count++; } } } System.out.println(step); } }
어떤 칸의 내구도가 감소하는 경우에만 내구도가 0인지 체크한다. 내구도가 0이 되었으면 zero_count++을 하여, 내구도가 0인 칸의 개수를 업데이트한다.

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!