본문 바로가기
Problem Solving/BOJ

[Python] 20055. 컨베이어 벨트 위의 로봇

by 부르르 2021. 4. 24.

www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net


 

Point

  • 내구도 0칸에는 로봇이 올라가지 못하며, 내려가기만 가능
  • 벨트 회전 시 로봇 좌표 변경
  • 이동하려는 칸에 로봇이 없어야하며 내구도 1이상
  • 올라가는 위치에서 로봇이 없어야만 올림

Tip

  • deque를 사용해 구현하면 코드가 간결해짐
  • 로봇 좌표를 체크할 check 배열을 생성해서 계속 업데이트 해줌

 

메모리 (제한: MB)

129232 KB

시간 (제한: 초)

688 ms

결과

100%

from collections import deque import sys def cnt_zeros(): ​​​​global k ​​​​cnt = 0 ​​​​for a in A: ​​​​​​​​if a == 0: ​​​​​​​​​​​​cnt += 1 ​​​​​​​​​​​​if cnt == k: ​​​​​​​​​​​​​​​​return True ​​​​return False input = sys.stdin.readline n,k = map(int, input().split()) A = deque(list(map(int, input().split()))) check = [False]*n step = 1 robots = deque() while True: ​​​​# 회전 ​​​​a = A.pop() ​​​​A.appendleft(a) ​​​​# 회전으로 로봇 위치 변경 ​​​​if robots: ​​​​​​​​tmp = deque() ​​​​​​​​while robots: ​​​​​​​​​​​​r = robots.popleft() ​​​​​​​​​​​​check[r] = False ​​​​​​​​​​​​r += 1 ​​​​​​​​​​​​if r == n-1: ​​​​​​​​​​​​​​​​pass ​​​​​​​​​​​​else: ​​​​​​​​​​​​​​​​check[r] = True ​​​​​​​​​​​​​​​​tmp.append(r) ​​​​​​​​robots = tmp ​​​​​​​​# 로봇이 있다면 순차적으로 이동 ​​​​​​​​tmp = deque() ​​​​​​​​while robots: ​​​​​​​​​​​​r = robots.popleft() ​​​​​​​​​​​​# 다른 로봇이 있거나 내구도가 0 일 경우 ​​​​​​​​​​​​if check[r+1] or A[r+1] == 0: ​​​​​​​​​​​​​​​​tmp.append(r) ​​​​​​​​​​​​elif not check[r+1] and A[r+1] != 0: ​​​​​​​​​​​​​​​​check[r] = False ​​​​​​​​​​​​​​​​r += 1 ​​​​​​​​​​​​​​​​A[r] -= 1 ​​​​​​​​​​​​​​​​if r == n-1: ​​​​​​​​​​​​​​​​​​​​pass ​​​​​​​​​​​​​​​​else: ​​​​​​​​​​​​​​​​​​​​check[r] = True ​​​​​​​​​​​​​​​​​​​​tmp.append(r) ​​​​​​​​robots = tmp ​​​​# 로봇 올림 ​​​​if not check[0] and A[0] > 0: ​​​​​​​​robots.append(0) ​​​​​​​​A[0] -= 1 ​​​​​​​​check[0] = True ​​​​# 내구도 검사 ​​​​if cnt_zeros(): ​​​​​​​​break ​​​​step += 1 print(step)

 

문제를 푸는데 도움이 된 테스트 케이스

 

 

728x90
반응형

댓글