[BOJ] 20055 - 컨베이어 벨트 위의 로봇 🤖

김우경·2021년 4월 29일
0

삼성기출

목록 보기
32/37

문제 링크

20055 - 컨베이어 벨트 위의 로봇

문제 설명


그림과 같이 길이 N인 컨베이어 벨트 위에 길이가 2N인 벨트가 감겨있다. 내구도 A_i는 컨베이어 벨트 i번째 칸의 내구도이다.

이 위에 로봇을 올리려고 한다. 올리는 위치는 그림의 1, 내리는 위치는 그림의 N이다. 로봇은 컨테이너 벨트 위에서 이동 가능하고, 로봇을 올리거나 해당 칸으로 이동하면 내구도가 1 줄어든다.

이동 과정은 다음과 같다.

  1. 벨트와 로봇 한칸 회전
    : 이때 내리는 위치에 도착한 로봇은 내린다.
  2. 가장 먼저 벨트에 올라간 로봇부터 회전 방향으로 1칸 이동한다. 불가능하면 이동하지 않는다.
    : 이동 가능한 칸은 현재 로봇의 위치가 내리는 위치가 아니고, 이동하려는 칸에 로봇이 없고, 이동하려는 칸의 내구도가 1이상일때이다.
  3. 올리는 칸(그림의 1)이 내구도 0이 아니면 로봇을 올린다.
  4. 내구도 0인 칸이 K개 이상이면 과정을 종료하고 아니면 1번 칸으로 이동한다.

문제 풀이

아니 이거 문제 설명이 넘 애매하다,,,~! 가장 처음 수행되는 단계가 1번째라길래 종료할때 이동과정 1,2,3,4 중에 어떤 과정 진행중이냐고 묻는줄 ㄱ-
그리고 2번에서 로봇 이동할때 로봇이 이동한 칸이 내리는 칸이면 바로 내려줘야됨

암튼 이거 빼면 시키는 흐름대로 구현하면 되는 문제입니다.

import sys

input = sys.stdin.readline

N, K = map(int, input().split())
durability = list(map(int, input().split())) # 컨베이어 칸 별 내구도
robots = [0 for _ in range(N)] # 컨베이어 위 로봇 위치
robot_count = 1
count = 0
answer = 1

def rotate(l, n):
    return l[-n:] + l[:-n]

while True:
    # 1번 과정
    durability = rotate(durability, 1)
    robots = rotate(robots, 1)
    if robots[N-1] != 0:
        # 로봇 내리기
        robots[N-1] = 0
    
    # 2번 과정
    for i in range(N-2, -1, -1):
        if robots[i] != 0 and robots[i+1] == 0 and durability[i+1] >= 1:
            # 빈칸이고 내구성 1 이상이면
            robots[i+1] = robots[i]
            robots[i] = 0
            durability[i+1] -= 1
            if durability[i+1] == 0:
                count += 1
    if robots[N-1] != 0:
        # 로봇 내리기
        robots[N-1] = 0
    
    # 3번 과정
    if durability[0] != 0:
        robots[0] = robot_count
        robot_count += 1
        durability[0] -= 1
        if durability[0] == 0:
                count += 1
    
    # 4번 과정
    if count >= K:
        print(answer)
        break
    else:
        answer += 1

Python에서 list rotation

def rotate(l, n):
    return l[-n:] + l[:-n]

소요시간

30분 !

profile
Hongik CE

0개의 댓글