본문 바로가기

코테연습문제

[백준/Python] 20055 컨베이어 벨트 위의 로봇

※ 이 풀이법은 PyPy3으로 통과된 방법으로, Python3으로는 '시간 초과'가 뜨는 코드입니다

개인적인 "구현 연습"을 위해 외부 라이브러리 사용 없이 빡구현 한 코드입니다.

 

 

 

deque의 rotate를 사용하면 회전하는 컨베이어 벨트를 바로 만들 수 있었겠지만,

구현 연습을 위해 직접 구현했다.

또한 0의 개수를 셀 때도, count 함수를 사용하지 않고 직접 구현했다.

 

문제에서 주어진 컨베이어 벨트 작동 순서는 크게 3가지로,

1. 회전하고
2. 이동하고
3. 올린다
를 내구도의 0 개수가 K개 이상이 될 때까지 반복

라고 생각할 수 있다.
위의 세 과정을 모두 지나야 한 단계를 지났다고 생각한다.

 

따라서, 회전 / 이동 / 올림 을 각각 구현하고, 내구도 0의 개수를 세는 과정을 순서대로 구현했다.

N, K = map(int, input().split())
durability = [int(i) for i in input().split()]
robot = [0] * N
step = 0

# 0의 갯수가 K 이하일때까지 반복!
while True:
    nDu = [] * (2 * N)  # 초기화

    # 회전 + 로봇이 있는 칸이라면 같이 회전
    for i in range(N-1, -1, -1):
        if robot[i] == 1 and i < N-1:
            robot[i+1] = 1
            robot[i] = 0
        robot[-1] = 0
    nDu.append(durability[-1])
    for i in range((2*N)-1):
        nDu.append(durability[i])
    durability = nDu

    # 로봇 이동
    for i in range(N-1, -1, -1):
        if robot[i] == 1 and robot[i+1] == 0 and durability[i+1] >= 1:
            robot[i+1] = 1
            robot[i] = 0
            durability[i+1] -= 1
        robot[-1] = 0  # 언제든지 로봇이 '내리는 위치'에 도달하면 그 즉시 내린다.

    # 올리기
    if durability[0] != 0:
        durability[0] -= 1
        robot[0] = 1

    # 0 개수 확인
    step += 1
    cnt = 0
    for d in durability:
        if d == 0:
            cnt += 1
    if cnt >= K:
        print(step)
        break

풀이과정

  1. 회전: 새로운 리스트 nDu를 만들어 제일 마지막 요소를 nDu[0]에 넣고,
    0번째 ~ 2N-1번째까지를 순서대로 nDu[1]~[2N]에 넣음
    1-1. 컨베이어 벨트 위에 로봇이 있는 경우: 로봇의 위치를 나타내는 리스트 robot에 1이 있다면, 옆으로 이동
        ( 이 때 <이동>과 다른 점은, 컨베이어 벨트 전체가 움직이는 것이므로 이동해도 내구도의 변화 x )
  2. 이동: robot 리스트의 1을 원래자리는 다시 0으로 바꿔주고, 옆자리는 1로 바꿔줌
    옆자리의 내구도도 -1 해줌

  3.  올림: 제일 첫번째 자리의 내구도를 -1 해주고, robot리스트의 첫 번째 자리도 1로 바꿈

  4. 확인: 위 세 과정이 끝났다면 step을 +1 해주고,
    내구도를 담는 리스트를 돌며 0의 개수를 세서 K개 이상이면 step을 출력함
    내구도를 담는 리스트를 돌며 0의 개수를 세서 K개 미만이면 1~3과정을 반복함