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

김상우·2021년 11월 1일
0

문제 링크 : https://www.acmicpc.net/problem/20055

최근 코딩테스트 트렌드가 문제 이해, 독해 능력을 기반으로한 구현 문제를 많이 출제하는 것 같다. 2021 하반기 네이버 코딩테스트 2번 문제도 구현 문제였다. 이런걸 코딩 "피지컬 문제"라고 하기도 한다.

문제 이해가 쉽지 않은 문제였고 꽤 피지컬을 요하는 문제였던 것 같다.
from collections import deque 를 통해 덱 자료구조를 사용할 수 있다. 컨베이어 벨트가 회전한다는 문장을 보고 deque의 rotate 메서드를 사용하면 좋을 것 같다는 생각이 들어, deque로 문제를 해결했다.

그리고 처음에 deque 안에 tuple을 넣어 사용했는데, 요새 학교 수업 때문에 C++스럽게 생각했던것 같다.. 파이썬의 tuple 원소는 변경이 불가능하다.

Python 정답 코드

import sys
from collections import deque
N, K = map(int, input().split())
s = list(map(int, sys.stdin.readline().split()))
belt = deque([])
countingZero = 0

for x in s:
    # 칸에 로봇이 없음, 내구도
    belt.append([False, x])

step = 0
while True:
    step += 1
    # 1.벨트 회전
    belt.rotate(1)
    # - 내리는 위치에 도달하면 내림
    if belt[N-1][0]:
        belt[N-1][0] = False

    # 2.이동할 수 있다면 이동
    for i in reversed(range(2*N)):
        # 로봇이 없는 벨트는 이동 고려할 필요없음
        if not belt[i][0]: continue
        next = i+1
        if i == 2*N-1:
            next = 0
        # 로봇이 없고, 내구도가 1 이상이라면 이동.
        if not belt[next][0] and belt[next][1] >= 1:
            belt[next][0] = True
            belt[next][1] -= 1
            belt[i][0] = False
            if belt[next][1] == 0: countingZero += 1
            # 내리는 곳이면 내림.
            if next == N-1:
                belt[next][0] = False

    # 3. 올리기
    if not belt[0][1] == 0:
        belt[0][0] = True
        belt[0][1] -= 1
        if belt[0][1] == 0: countingZero += 1

    # 4. 과정 종료
    if countingZero >= K: break

print(step)

profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글