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

yylog·2022년 10월 5일
0
post-custom-banner

문제

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

소스코드

import sys
from collections import deque
sys.stdin = open("input.txt", 'r')
input = sys.stdin.readline

if __name__ == "__main__":
    n,k = map(int,input().split())
    belt = deque(list(map(int,input().split())))
    robot = deque([0] * n)
    res = 0

    while 1:
        belt.rotate(1)
        robot.rotate(1)
        robot[-1] = 0
        if sum(robot):
            for i in range(n-2,-1,-1):
                if robot[i+1]==0 and robot[i]==1 and belt[i+1]>0:
                    belt[i+1]-=1
                    robot[i+1] = 1
                    robot[i]=0
            robot[-1] = 0
        if belt[0] > 0:
            belt[0]-=1
            robot[0]=1
        res +=1
        if belt.count(0) >=k:
            break
    print(res)

설명

구현 문제로 컨베이어 벨트가 돌아간다는 것을 데크로 구현해주면 된다.
컨베이어 벨트는 2n개가 돌아가지만 로봇은 n개만 돌아간다 --> n에서 무조건 하차하니까
그래서 컨베이어 벨트랑 로봇이랑 배열을 2개로 나눠서 회전 (나는 처음에 같이 묶어서 2차원 배열로 하려니까 헷갈림;;;)

위의 원리를 이해한 후 문제에서 설명한 그대로 구현하면 된다.

  1. 배열 회전
  2. n 위치에 있는 로봇 하차
  3. n-2 부터 역순으로 체크해서 그 다음 칸에 로봇 없고 내구도 0보다 크면 로봇 이동
    3-1. n-1엔 아무것도 없음 (아까 하차시킴)
    3-2. 컨베이어 벨트는 내구도만 따지면 되니까 로봇배열만 생각해서 n 개만 탐색해주면 됨
  4. 이동 종료 후엔 n 위치 로봇 한번 더 하차
  5. 로봇 0 칸에 내구성 0보다 크면 로봇 올리기 (내구도 내려줌)
  6. 단계 +=1
  7. 내구도가 0인 칸이 k개 이상이면 종료

후기

나는 너무 어렵게 생각한다 쉽게 접근해보자ㅠ.ㅠ
새롭게 알게된 문법이 있었다

  • deque.rotate(1) : 데크 자체에서 rotate 함수 지원;;;; 1만큼 오른쪽으로 회전한다. 만약 음수를 넣으면 -1 만큼 왼쪽으로 회전 가능
  • belt.count(0) : 배열에서 0의 갯수 카운트
profile
경험하고 공부한 모든 것을 기록하는 공간
post-custom-banner

0개의 댓글