미소를뿌리는감자의 코딩

[백준 2024/02/20] 20055번 컨베이어 벨트 위의 로봇 본문

코딩 테스트/백준

[백준 2024/02/20] 20055번 컨베이어 벨트 위의 로봇

미뿌감 2024. 2. 20. 22:36
728x90

https://www.acmicpc.net/problem/20055

 

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

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

www.acmicpc.net

 

1. 접근 방법

컨베이어의 위 아래로 나누어서, 구분을 해주었다.

robots라는 list를 만들어 주어서, 로봇의 위치(인덱스 값)을 저장해주었다. 이를 통해 로봇이 컨베이어 벨트의 끝에 도달했는지 혹은 앞에 다른 로봇이 있는지 알아볼 수 있었다.

이후 함수는 step1, step2, step3로 나누어서 문제에 적혀있는대로 코드를 작성해 주었다.

 

+ remove_indices 라는 list를 만든 이유:

처음에는, 그냥 로봇이 끝에 도달했을 때, 해당 robots.pop(n-1) 을 바로 해주었었다. 하지만, for i in range (len(robots)) 에서 index out of range error가 발생하였다. 그 이유는, pop을 하게 되어, list의 길이가 달라져 없는 곳에 접근하려고 했기 때문이다.

 

따라서, pop을 하고자 하는 index를 remove_indices라는 list에 저장해두고, 후에 한번에 pop을 해주었다.

주의해야할 점은, 뒤에서 부터 pop을 해야지 index out of range error가 발생하지 않는다. 

for p in reversed(remove_indices):
	robots.pop(p)

 

 

step1 : 벨트가 각 칸 위에 이는 로봇과 함께 한 칸 회전

step2 : 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동, 이동할 수 없다면 가만히

             - 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.

step3 : 올리는 위치에 있는 칸의 내구도가 0 이 아니면 올리는 위치에 로봇을 올림

step4 : 내구도가 0 인 칸의 개수가 k개 이상이라면 과정을 종료 그렇지 않다면 1번으로 돌아감 -> while 문의 탈출 조건

 

2. 코드

def step1(robots):
    down_list.append(up_list.pop())
    up_list.insert(0, down_list.pop(0))
    remove_indices = []
    for i in range(len(robots)):
        if robots[i] + 1 >= n-1:
            remove_indices.append(i)
            continue
        robots[i] += 1

    for p in reversed(remove_indices):
        robots.pop(p)
    return robots

def step2(robots):
    remove_indices = []
    for i in range(0, len(robots)):
        if robots[i] + 1 not in robots and robots[i] + 1 < n:
            next_position = robots[i] + 1
            if up_list[next_position] > 0:
                up_list[next_position] -= 1
                robots[i] = next_position
                if next_position == n-1:
                    remove_indices.append(i)

    for i in sorted(remove_indices, reverse=True):
        robots.pop(i)

def step3(robots):
    if up_list[0] != 0:
        robots.append(0)
        up_list[0] -= 1


if __name__ == '__main__':
    n, k = map(int, input().split())
    durability = list(map(int, input().split()))
    up_list = []
    down_list = []
    robots = []

    for i in range(n):
        up_list.append(durability[i])

    for i in range(2 * n - 1, n - 1, -1):
        down_list.append(durability[i])


    steps = 0
    while up_list.count(0) + down_list.count(0) < k:
        steps += 1
        step1(robots)
        step2(robots)
        step3(robots)

    print(steps)
728x90