From 7c30191f637a3f1cfe35abbcdff037419e8c8b32 Mon Sep 17 00:00:00 2001 From: nkey Date: Wed, 11 Mar 2026 10:40:37 +0900 Subject: [PATCH] =?UTF-8?q?20055-g5=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_8708/gold/20055-g5.py | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 workbook_8708/gold/20055-g5.py diff --git a/workbook_8708/gold/20055-g5.py b/workbook_8708/gold/20055-g5.py new file mode 100644 index 0000000..f422f17 --- /dev/null +++ b/workbook_8708/gold/20055-g5.py @@ -0,0 +1,75 @@ +# 컨베이어 벨트 위의 로봇 + +import sys +from collections import deque + +input = sys.stdin.readline + +def solution(): + n, k = map(int, input().rstrip().split()) + health = [-1] + list(map(int, input().rstrip().split())) + robot = [0] * (2*n+1) + robot_order = deque([]) + front = deque([i+1 for i in range(n)]) + back = deque([i for i in range(2*n, n, -1)]) + unhealth_count = 0 + result = 0 + + while unhealth_count < k: + result += 1 + front.appendleft(back.popleft()) + back.append(front.pop()) + + if robot[front[-1]] == 1: + robot_order.popleft() + robot[front[-1]] = 0 + + now_robot_len = len(robot_order) + for _ in range(now_robot_len): + idx = robot_order.popleft() + nxt = idx + 1 + if idx == (2*n): + nxt = 1 + if robot[nxt] == 0 and health[nxt] > 0: + robot[idx] = 0 + robot[nxt] = 1 + robot_order.append(nxt) + health[nxt] -= 1 + if health[nxt] == 0: + unhealth_count += 1 + else: + robot_order.append(idx) + + if robot[front[-1]] == 1: + robot_order.popleft() + robot[front[-1]] = 0 + + if robot[front[0]] == 0 and health[front[0]] > 0: + robot_order.append(front[0]) + robot[front[0]] = 1 + health[front[0]] -= 1 + if health[front[0]] == 0: + unhealth_count += 1 + + print(result) + + return + + +solution() + +""" +걸린 시간: 26분 + +시간 복잡도: 내구도가 1000까지이고, 이게 다 깎인 것이 k개가 될때까지이므로 O(1000*k)인데, 중간에 로봇이 한칸씩 움직이기 때문에 +컨베이어벨트 윗부분인 n만큼 for문을 돈다. 근데 나는 로봇이 있는 칸만 확인하기 때문에 O(1000*k*n)보다는 적다. + +해설: 문제조건대로 그대로 구현하면 된다. 벨트가 도는 것은 2개의 deque를 활용해서 구현하였고, 로봇이 있는 칸만 확인하기 위해 robot이 들어간 순서를 +기록해놓는 robot_order를 queue로 구현한다. 각 단계를 구현하는 것은 기록할 것들만 잘 생각해서 빼먹지 않으면 어렵지 않게 가능하다. +또한 2n에서 다음 칸이 1이기 때문에 이것만 예외처리 하면 된다. + + 로봇을 올릴 경우 로봇을 내릴 경우 +robot: 로봇 유무 | 1 | 0 +health: 내구도 | -1 | - +robot_order: 로봇 올린 순서 | append(nxt) | popleft(now) +""" \ No newline at end of file