BOJ 20055

노영진·2023년 9월 29일


링크텍스트

내 코드

# 20055
from collections import deque

n, k = map(int, input().split())
arr = deque(list(map(int, input().split()))) # 2n개

places = deque([0] * n)

count = 0
while True:
    # 1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전
    count += 1
    arr.appendleft(arr.pop())
    places.appendleft(places.pop())
    # 하차
    if places[-1] == 1:
        places[-1] = 0

    # 2. 가장 먼저 벨트에 올라간 로봇부터(가장 멀리 있는 로봇부터), 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면(내구도) 이동.
    for i in range(n-2, -1, -1):
        if (places[i] == 1) and (places[i+1] == 0) and arr[i+1] > 0:
            places[i], places[i+1] = 0, 1
            arr[i+1] = arr[i+1] - 1
            if places[-1] == 1:
                places[-1] = 0
    # 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
    if arr[0] > 0:
        places[0] = 1
        arr[0] = arr[0] - 1
    
    # 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
    if arr.count(0) >= k:
        break

print(count)

접근

우선, 제한이 2 <= N <= 100, 1 <= K <= 2N, 1 <= Ai <= 1000 으로 매우 여유롭다.
그래서 일단 그대로 구현해보았다.

  1. 내구도를 기록해두는 arr 테이블과 로봇들의 위치를 저장해두는 places테이블을 만들었다.
    • deque를 이용하여 양방향 큐 구현
  2. 순서대로 구현
    • 로봇을 내리는 것과 내구도 -1 해주는 것, 가장 멀리 있는 로봇부터 이동. 이것만 조심해서 그대로 구현했더니 맞긴 했다.

문제 자체는 매우 쉬운 것 같은데 글을 이해하는데 좀 오래 걸렸다. 이렇게 어렵게 적어놓을 일인가 싶은..! 그대로 구현해서 좋은 코드인지는 잘 모르겠지만 맞았으니 죄책감 없이 넘어가도록 하겠습니다.

0개의 댓글