파이썬 알고리즘 282번 | [백준 20055번] 컨베이어 벨트 위의 로봇 - 구현

Yunny.Log ·2022년 12월 28일
0

Algorithm

목록 보기
287/318
post-thumbnail

282. 컨베이어 벨트 위의 로봇

1) 어떤 전략(알고리즘)으로 해결?

구현

2) 코딩 설명

주석 설명

<내 풀이>


import sys
from collections import deque
n, k  = map(int, sys.stdin.readline().split()) 
q = deque(map(int,sys.stdin.readline().split()))
zero=0 
# 내구도 0의 갯수

for i in q :
    if i==0:
        zero+=1
robot_location = [] 
stage = 1

# 얘도 회전시키기 편하게 큐로 하려했는데
# 가장 먼저 벨트에 올라간 로봇을 알아야해서 리스트로 구현
# 리스트 앞에 있을 수록 먼저 올라간 로봇 

# 컨베이어 벨트를 회전 시키고 로봇을 얹는다고 합니다.
# 박스 모양 로봇을 하나씩 올리려고 한다.
while(True) :
    
    # 1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
    q.appendleft(q.pop()) # 벨트 회전
    for i in range(len(robot_location)) : # 로봇 위치 한 칸 이동
        robot_location[i] = robot_location[i]+1
    
    while n-1 in robot_location:
        robot_location.remove(n-1)

    # 2. 가장 먼저 벨트에 올라간 로봇부터 (리스트 앞부터), 벨트가 회전하는 방향으로 
    # 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
        #   2-1 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 
        #   그 칸의 내구도가 1 이상 남아 있어야 한다.
        
    for i in range(len(robot_location)):
        if ((robot_location[i]+1) not in robot_location and q[(robot_location[i]+1)]>0) : 
            robot_location[i]+=1
            q[robot_location[i]]-=1
            if(q[robot_location[i]]==0):
                zero+=1
            
    while n-1 in robot_location:
            robot_location.remove(n-1)
    
    # 3. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.

    if q[0]>0 :
        robot_location.append(0)
        q[0]-=1
        if(q[0]==0):
            zero+=1

    # 4. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
    if zero>=k :
        print(stage)
        exit(0)
    else : 
        stage+=1
        
  • 내구도가 줄어드는 경우마다 이 내구도가 0 에 도달했는지 체크해주었다.

<반성 점>

  • 문제 설명이 약간 아리까리한게 많아서 구현하는데 오래걸렸다. 구현은 문제 잘 읽는게 70프로라고 본다.

0개의 댓글