Gold 5
문제 : https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
문제 풀이
ㅎ.. 내리는 위치라는걸 컨베이어 위칸에서 아래칸으로 내린다는 의미로 이해해서 한참 헤맸다..
이게 맞나? 싶어서 구글링해보니까 역시 아니었고.. 로봇은 0에서 컨베이어 벨트 위로 올라가고 n에서 컨베이어 밖으로 내려온다는 의미였다.
따라서 컨베이어 벨트는 1부터 2n까지 한칸씩 회전하지만 로봇은 1부터 n까지 회전하게 된다.
회전도 직접 원소들을 빼고 넣는 것보다 deque의 rotate라는 메서드를 이용하면 쉽게 회전 시킬 수 있다.
- deque.rotate(num): 데크를 num만큼 회전한다(양수면 오른쪽, 음수면 왼쪽).
이외에는 문제에서 주어진 순서대로 코딩만 해주면 된다.
코드
from collections import deque
n, k = map(int, input().split())
belt = deque(list(map(int, input().split())))
robot = deque([0] * n)
count = 1
while True:
# 한칸 회전
belt.rotate(1)
robot.rotate(1)
robot[-1] = 0
# 모든 로봇 이동
if sum(robot):
for i in range(n-2, 0, -1):
# 현재 칸에 로봇이 있는데 옆칸이 비어있고 내구도가 1이상이면
if belt[i+1] > 0 and robot[i+1] == 0 and robot[i] == 1:
belt[i+1] -= 1
robot[i+1] = 1
robot[i] = 0
# 맨 끝에 있는 로봇 내리기
robot[-1] = 0
# 올리는 위치의 내구도가 0보다 크고 로봇이 없으면 새 로봇 올리기
if belt[0] > 0 and robot[0] == 0:
robot[0] = 1
belt[0] -= 1
if belt.count(0) >= k:
print(count)
break
else:
count += 1
추가로..
https://leonkong.cc/posts/python-deque.html
Python - 데크(deque) 언제, 왜 사용해야 하는가?
Python의 데크(deque)에 대해 알아보고 언제, 왜 써야 하는지 살펴본다
leonkong.cc
https://www.geeksforgeeks.org/deque-in-python/
Deque in Python - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
Deque는 삽입 삭제에 시간복잡도가 O(1)로 일반 리스트에 비해 굉장히 빠르다고 한다.
다양한 메서드도 제공하고 있으니 알아두면 좋을 것 같다.
'Algorithm > Problem' 카테고리의 다른 글
[Baekjoon] 14891 : 톱니바퀴 - Python (0) | 2022.02.07 |
---|---|
[Baekjoon] 15683번 : 감시 - Python (0) | 2022.02.04 |
[Baekjoon] 2565번 : 전깃줄 (0) | 2022.01.25 |
[Baekjoon] 11054번 : 가장 긴 바이토닉 부분 수열 (0) | 2022.01.24 |
[Baekjoon] 2156번 : 포도주 시식 (0) | 2022.01.21 |