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

거북이·2023년 10월 4일
0

백준[골드5]

목록 보기
75/82
post-thumbnail

💡문제접근

  • 고차원적인 알고리즘을 사용하지 않는 단순 구현 문제
  • 지문의 길이에 당황한 것도 있지만 테스트케이스를 직접 그려가면서 했는데도 이해가 잘 안 가는 부분이 상당히 많았다. 실제로 이런 문제를 만났을 때 자신있게 풀 수 있을지도 모르겠다.
  • 회전을 위해서 덱을 사용해야 한다는 점, 다른 일부분을 떠올리는 것까지는 성공했으나 구현하는 과정에서 진전이 없었고 결국 이 문제를 자력으로 해결하지 못했다.
  • 1~4단계가 존재하는데 문제의 뉘앙스는 몇 번째 단계에서 멈추느냐를 묻는 것처럼 보이지만 실제 구하고자 하는 것은 1~4단계의 로테이션이 총 몇 번 돌았느냐를 구하는 것이었다.

💡코드(메모리 : 119684KB, 시간 : 1424ms, PyPy3로 제출)

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

def solve(N, K, A):
    res = 0
    # 컨베이어 벨트 : deque로 구현
    belt = deque([False] * N)

    while True:
        res += 1
				
        A.rotate(1)		# 내구도 : 회전 有
        belt.rotate(1)	# 컨베이어 벨트 : 회전 有

        belt[N-1] = False	# 로봇이 내리는 위치에 도달하면 즉시 로봇을 내린다.
        for i in range(N-2, -1, -1):	
        	# 만약 이동하려는 칸의 내구도가 0보다 크면서 현재 있는 벨트에서의 위치에 로봇이 존재하면서 이동하려는 칸에 로봇이 없는 경우라면? → 이동이 가능함
            if A[i+1] > 0 and belt[i] and not belt[i+1]:
            	# 현재 위치 로봇 : False, 다음 위치 로봇 : True
                belt[i], belt[i+1] = False, True
                # 내구도 감소
                A[i+1] -= 1
        # 로봇이 내리는 위치에 도달하면 즉시 로봇을 내린다.
        belt[N-1] = False
		
        # 올리는 위치에 있는 칸의 내구도가 0보다 큰 값이라면? → 로봇을 올린다.
        # 로봇을 올리는 위치에 올리거나 로봇이 어떤 칸으로 이동하면 그 칸 내구도는 즉시 1만큼 감소
        if A[0] > 0:
            belt[0] = True
            A[0] -= 1
		
        # 내구도가 0인 칸의 개수가 K개 이상이라면? → 즉시 종료
        if A.count(0) >= K:
            break
    return res

N, K = map(int, input().strip().split())
A = deque(map(int, input().strip().split()))
print(solve(N, K, A))

💡소요시간 : 2h ↑

0개의 댓글