1 minute read


sport

bj 20055 - 컨베이어 벨트 위의 로봇

입력크기가 크지 않아서 비효율적인 방법으로도 충분히 될 거라고 생각했는데, 생각보다 기본 처리에서 조회 연산으로 시간이 들어서 그런지 python3로는 시간초과가 나고, pypy3로 제출해서 통과했다.

어이없는 실수가 있었는데, 한참을 못 찾았다.

py solution

lower_belt는 문제의 인덱스를 따라 역순으로 배치해야 문제에서 나온 형태로 배치하게 되는 것인데, 그냥 arr[N:]을 써서 틀린 것이었다.


def solve():
    from collections import deque
    N,K = ria()
    arr = ria()

    upper_belt = deque(arr[:N])
    lower_belt = deque(reversed(arr[N:]))
    robots = [0] * N
    zeros = 0
    step = 0

    def move_belt():
        nonlocal zeros
        for i in reversed(range(N)):
            if(i == N-1):
                robots[i] = 0
            elif(robots[i+1] == 0 and robots[i] == 1):
                robots[i] = 0
                robots[i+1] = 1
                if(i+1==N-1):
                    robots[i+1] = 0
        last_upper_belt_item = upper_belt[-1]
        first_lower_belt_item = lower_belt[0]
        upper_belt.pop()
        upper_belt.appendleft(first_lower_belt_item)
        lower_belt.popleft()
        lower_belt.append(last_upper_belt_item)

    def load_robot():
        nonlocal zeros
        if(upper_belt[0] > 0):
            upper_belt[0] -= 1
            if(upper_belt[0] == 0):
                zeros += 1
            robots[0] = 1

    def move_robots():
        nonlocal zeros
        for i in reversed(range(N)):
            # print(i)
            if(i == N-1):
                if(robots[i] == 1):
                    robots[i] = 0
            elif(upper_belt[i+1] > 0 and robots[i+1] == 0 and robots[i] == 1):
                    robots[i] = 0
                    robots[i+1] = 1
                    upper_belt[i+1] -= 1
                    if(upper_belt[i+1] == 0):
                        zeros += 1
    
    while(zeros < K):
        move_belt()
        move_robots()
        load_robot()
        step+=1
    
    print(step)
    return

Comments