[Python/백준] 20055 컨베이어 벨트 위의 로봇Coding Test/Python2023. 11. 27. 23:57
Table of Contents
728x90
반응형
https://www.acmicpc.net/problem/20055
<문제 해설>
구현 시뮬레이션 문제이다. 시키는 데로 코드를 작성하기만 하면 되서 편했다.
벨트를 구현할 배열을 deque를 사용해 만든다. 로봇의 위치를 저장할 배열또한 만든다.
단계가 진행되는 만큼 stage를 증가 시키고 count로 내구도가 0이 몇개가 생겼는지 기록한다.
- 벨트가 각 칸위에 있는 로봇과 함께 한칸 회전한다.
이때 컨베이어 벨트는 pop하고 appendleft해서 회전을 구현한다.
로봇배열에 로봇이 있다면 위치를 이동시켜준다. - 로봇을 이동시킨다.
조건을 맞춰준다. 이때 내구도가 0이되는 칸이 발생하면 count를 증가시킨다. - 로봇 배열의 첫 칸에 로봇을 올린다. 이때도 컨베이어 벨트 배열의 첫 칸이 내구도가 0이되면 count를 증가시킨다.
- count가 K보다 같거나 커지면 멈추고 stage를 출력한다. 작다면 stage를 증가시키고 반복한다.
<예시>
차시는 단계를 나타내며 번호는 단계의 진행상황이다.
N = 3 K = 2 이다.
처음 밸트배열은 내구도가 저장되는 A배열을 만들었으며 1 2 1 2 1 2 가 들어간다.
- 밸트가 회전했다.
- 로봇이 없음으로 아무런 일도 진행되지 않는다.
- 로봇이 A[0] 에 들어감으로 첫번째 칸의 내구도가 1 감소한다.
- count는 0이고 K보다 작아 계속진행한다.
- 벨트가 회전했고 로봇또한 회전해서 첫번째 칸에 있는 로봇이 2번째 칸으로 이동했다.
- 로봇의 앞칸에 로봇이 없고 내구도 또한 1이 있음으로 로봇이 3번재 칸으로 이동했다.
3번째 칸은 N값임으로 로봇이 내린다. 그래서 로봇 배열은 0 0 0 으로 저장되는 모습
A[2] 의 내구도가 0이 됐음으로 count를 증가시킨다. - A[0] 의 내구도가 1이 였음으로 로봇을 올린다. A[0] 의 내구도가 0 이 됐음으로 count를 증가시킨다.
- count = 2가 됐음으로 반복문을 중지하고 stage값을 출력한다.
<코드>
from collections import deque
import sys
N, K = map(int,sys.stdin.readline().split())
A = deque(list(map(int,sys.stdin.readline().split())))
count = 0
stage = 0
robots = [0]*N
while(1):
A.appendleft(A.pop())
for n in range(N - 2, -1, -1):
if robots[n] == 1:
robots[n] = 0
robots[n + 1] = 1
if robots[N - 1] == 1:
robots[N - 1] = 0
for n in range(N - 2, -1, -1):
if robots[n] == 1 and robots[n + 1] == 0 and A[n + 1] != 0:
robots[n] = 0
robots[n + 1] = 1
A[n + 1] -= 1
if A[n + 1] == 0:
count += 1
if robots[N - 1] == 1:
robots[N - 1] = 0
if A[0] != 0:
A[0] -= 1
robots[0] = 1
if A[0] == 0:
count += 1
stage += 1
if count >= K:
break
print(stage)
<코드 설명>
from collections import deque //deque를 사용하기 위한 정의
import sys //sys를 사용하지 않을경우 시간초과가 난다.
N, K = map(int,sys.stdin.readline().split()) //N,K입력
A = deque(list(map(int,sys.stdin.readline().split()))) //컨베이어 벨트 배열 받아오기
count = 0 //내구도가 0이 몇개가 있는지 저장하는 변수
stage = 0 //단계가 몇번 진행되는지 저장하는 변수
robots = [0]*N //로봇의 위치를 저장하는 배열
while(1): //계속 반복
A.appendleft(A.pop()) //벨트의 오른쪽 끝값을 빼서 왼쪽에 넣어준다. (회전시킨다.)
for n in range(N - 2, -1, -1): //로봇 배열의 가장 끝값부터 계산 가장 끝자리는 로봇을 내리니 끝 -1 자리부터 시작
if robots[n] == 1: //로봇이 존재하는 자리라면
robots[n] = 0 //로봇을 1칸 전진
robots[n + 1] = 1
if robots[N - 1] == 1: //로봇이 끝자리로 가면
robots[N - 1] = 0 //로봇을 내린다 여기까지가 컨베이어 벨트 회전에 의한 로봇의 이동
for n in range(N - 2, -1, -1): //벨트가아닌 로봇이 직접 움직이는 단계
if robots[n] == 1 and robots[n + 1] == 0 and A[n + 1] != 0: //제약조건이 어긋나지 않을 경우
robots[n] = 0 //로봇을 1칸 전진
robots[n + 1] = 1
A[n + 1] -= 1 //내구도를 낮추고 내구도가 0이 된다면 count값 증가
if A[n + 1] == 0:
count += 1
if robots[N - 1] == 1: //로봇이 끝자리로 가면 로봇 내리기
robots[N - 1] = 0
if A[0] != 0: //벨트의 첫 칸에 로봇 올리기 내구도가 0이 아니면 올린다.
A[0] -= 1 //내구도 깍는데 내구도가 0이되면 count증가
robots[0] = 1
if A[0] == 0:
count += 1
stage += 1 //1개의 단계를 모두 수행했으니 단계 증가
if count >= K: //내구도가 없는 칸이 K보다 많거나 같으면 반복문 중지
break
print(stage) //출력
import sys //sys를 사용하지 않을경우 시간초과가 난다.
N, K = map(int,sys.stdin.readline().split()) //N,K입력
A = deque(list(map(int,sys.stdin.readline().split()))) //컨베이어 벨트 배열 받아오기
count = 0 //내구도가 0이 몇개가 있는지 저장하는 변수
stage = 0 //단계가 몇번 진행되는지 저장하는 변수
robots = [0]*N //로봇의 위치를 저장하는 배열
while(1): //계속 반복
A.appendleft(A.pop()) //벨트의 오른쪽 끝값을 빼서 왼쪽에 넣어준다. (회전시킨다.)
for n in range(N - 2, -1, -1): //로봇 배열의 가장 끝값부터 계산 가장 끝자리는 로봇을 내리니 끝 -1 자리부터 시작
if robots[n] == 1: //로봇이 존재하는 자리라면
robots[n] = 0 //로봇을 1칸 전진
robots[n + 1] = 1
if robots[N - 1] == 1: //로봇이 끝자리로 가면
robots[N - 1] = 0 //로봇을 내린다 여기까지가 컨베이어 벨트 회전에 의한 로봇의 이동
for n in range(N - 2, -1, -1): //벨트가아닌 로봇이 직접 움직이는 단계
if robots[n] == 1 and robots[n + 1] == 0 and A[n + 1] != 0: //제약조건이 어긋나지 않을 경우
robots[n] = 0 //로봇을 1칸 전진
robots[n + 1] = 1
A[n + 1] -= 1 //내구도를 낮추고 내구도가 0이 된다면 count값 증가
if A[n + 1] == 0:
count += 1
if robots[N - 1] == 1: //로봇이 끝자리로 가면 로봇 내리기
robots[N - 1] = 0
if A[0] != 0: //벨트의 첫 칸에 로봇 올리기 내구도가 0이 아니면 올린다.
A[0] -= 1 //내구도 깍는데 내구도가 0이되면 count증가
robots[0] = 1
if A[0] == 0:
count += 1
stage += 1 //1개의 단계를 모두 수행했으니 단계 증가
if count >= K: //내구도가 없는 칸이 K보다 많거나 같으면 반복문 중지
break
print(stage) //출력
728x90
반응형
'Coding Test > Python' 카테고리의 다른 글
[Python/백준] 3190_뱀 (1) | 2023.12.03 |
---|---|
[Python/백준] 14503 로봇 청소 (1) | 2023.12.02 |
[Python/백준] 10026 적록색약 (0) | 2023.03.19 |
[Python/백준] 7576 토마토 (0) | 2023.03.08 |
[Python/백준] 2170 선 긋기 (1) | 2023.03.05 |
@코딩하는 자연대생 :: 자연대생도 코딩을 하고 싶어
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간