프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

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

중규리 2024. 1. 4. 14:16

🐸 문제 정보

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

 

🤖 알고리즘

구현

 

⏱️ 풀이 시간

60m +

 

📝 풀이

문제가 난해하고 지문이 불친절해서 진짜 코테를 보는 것 같았다.

인덱스로 접하는 경우가 많은 것 같아, 처음에는 리스트로 풀다가 후에 회전 문제를 고치면서 deque로 바꿨다.

단계를 잘 나누어서 풀어야하는 것 같다.

 

  1. 벨트와 로봇 큐를 시계 방향으로 1만큼 회전
  2. 역순 순회하면서 로봇 이동
    • 현재 자리에 로봇이 있어야함
    • 시계 방향 다음 자리에 로봇이 없어야함
    • 시계 방향 다음 자리에 벨트 내구도가 남아있어야함
    • 로봇이 내리는 점으로 이동하면 False로 바꿔주기
  3. 올리는 곳에 로봇이 없고 벨트의 내구도가 남아있다면 로봇 올려주기
    • 올리면서 내구도 1 감소

사실 시간이 오래 걸렸던 부분은 3단계의 로봇을 올리는 부분이다.

애초에 문제에서 올리는 곳에 로봇이 없을 수 밖에 없는 로직이기 때문에, 그냥 로봇을 올린다고 했는데 계속해서 테케를 통과하지 못했다.

이후 로봇이 없는 경우에만 로봇을 올려준다고 수정하자 바로 통과할 수 있었다.

 

구현 자체가 어려운 문제는 아니었으나, 기업 코테의 불친절한 지문을 체감할 수 있는 문제였다.

더보기

틀린코드

import sys
from collections import deque
input = sys.stdin.readline

n, k = list(map(int, input().rstrip().split()))
belt = deque(list(map(int, input().rstrip().split())))
robots = deque([False] * n)

def belting(): # 1단계
    belt.rotate(1)
    robots.rotate(1)
    robots[-1] = False

def moving(): # 2단계
    for i in range(n - 2, 0, -1):
        if (robots[i]) and (not robots[i + 1]) and (belt[i + 1] > 0):
            robots[i] = False
            robots[i + 1] = True
            belt[i + 1] -= 1
    robots[-1] = False

def setting(): # 3단계
    if belt[0] > 0:
        belt[0] -= 1
    robots[0] = True

res = 0
while True:
    res += 1
    belting()
    moving()
    setting()
    if belt.count(0) >= k: break

print(res)

 

🧑‍💻 나의 답

# pypy3

import sys
from collections import deque
input = sys.stdin.readline

n, k = list(map(int, input().rstrip().split()))
belt = deque(list(map(int, input().rstrip().split())))
robots = deque([False] * n)

def belting(): # 1단계
    belt.rotate(1)
    robots.rotate(1)
    robots[-1] = False

def moving(): # 2단계
    for i in range(n - 2, 0, -1):
        if (robots[i]) and (not robots[i + 1]) and (belt[i + 1] > 0):
            robots[i] = False
            robots[i + 1] = True
            belt[i + 1] -= 1
    robots[-1] = False

def setting(): # 3단계
    if (not robots[0]) and (belt[0] > 0):
        robots[0] = True
        belt[0] -= 1

res = 0
while True:
    res += 1
    belting()
    moving()
    setting()
    if belt.count(0) >= k: break

print(res)