https://www.acmicpc.net/problem/20055
이 문제같은 경우에는
간단하게 deque의 rotate함수를 활용하는 방식이 있습니다만
공부의 관점에서 빡구현을 해봤습니다.
이 문제가 요구하는 사항은 다음과 같습니다.
1. 컨베이어벨트와 로봇을 돌린다.
2. 로봇을 이동
3. 새로운 로봇 투입
이 세가지를 반복해주는 작업을 겨쳐줍니다.
먼저, 컨베이어 밸트를 옮겨주는 작업,
여기서 end는
2*N입니다.
#1.밸트위의 로봇과 함께 회전
tmp=graph[end-1]
graph[1:end]=graph[0:end-1]
graph[0]=tmp
처음에는
graph[1:end-1]=graph[0:end-2]
이렇게 코드를 구성했으나
문제가 원하는 데로
컨베이어 밸트가 이동하지 않았습니다.
그 이유는
list[1:X]이렇게 넣으면
range(X)가 X-1까지 범위를 해주듯
얘도 그렇게 작동했습니다.
그래서 위의 예시처럼 해줘야
제대로 동작합니다.
그리고 로봇이 움직일 때
내리는 위치(N-1)에 이동하면
로봇을 내려줘야 합니다.
처음에 제가 이걸 놓쳐서
고생을 조금 했습니다.
2.로봇이동의 경우
로봇을 넣은 순서대로 움직이라고 되어있습니다.
저는 robot이라는 리스트를 만들어
3에서 로봇을 투입하는 데로
append를 시켜줬고
for문을 활용해서
순서대로 구해주었습니다.
3. 로봇 투입의 경우
투입위치 graph[0]가
0보다 큰 지 보고 로봇을 투입시켜줍니다.
#백준 20055 컨베이어 밸트위의 로봇
N,K=map(int,input().split())
graph=list(map(int,input().split()))
#올리는 위치-0 내리는 위치-N-1
robot=[]
end=(2*N)
level=0
while True:
#1.밸트위의 로봇과 함께 회전
tmp=graph[end-1]
graph[1:end]=graph[0:end-1]
graph[0]=tmp
#print(robot)
if robot:
pop_robot=[]
for i in range(len(robot)):
robot[i]=(robot[i]+1)%(2*N)
if robot[i]==N-1:
pop_robot.append(i)
if pop_robot:
while pop_robot:
po=pop_robot.pop()
robot.pop(po)
#2.가장 먼저 올라간 로봇부터 이동
if robot:
pop_robot=[]
for i in range(len(robot)):
move_robot=(robot[i]+1)%(end)
if graph[move_robot]>0 and not move_robot in robot:
robot[i]=move_robot
graph[move_robot]-=1
#움직인 위치가 내리는 위치라면
if move_robot==N-1:
pop_robot.append(i)
if pop_robot:
while pop_robot:
po=pop_robot.pop()
robot.pop(po)
#3.올리는 위치 내구도가 0이 아니라면 로봇을 올림.
if graph[0]>0:
robot.append(0)
graph[0]-=1
level+=1
#내구도가 0인게 K이상이면 종료
if graph.count(0)>=K:
break
print(level)
pypy3로 통과했으나
python3로는 시간초과가 발생했습니다.
https://jinu0418.tistory.com/16
물론 이렇게 rotate함수를 쓰면
간단하게도 풀 수 있습니다.
rotate가 만약에 생각이 안났다?
그리고 내가 새로운 문제에 대한 적응이 필요하다?
라고 한다면
rotate대신 썡구현도 해볼만 할 것 같네요
[백준 14467번] 소가 길을 건너간 이유1(python) (0) | 2022.06.07 |
---|---|
[백준 17144번] 미세먼지 안녕!(파이썬) (0) | 2022.04.27 |
[백준 14899번] 스타트와 링크(파이썬) (0) | 2022.04.24 |
[백준 19236번] 청소년 상어(파이썬) (0) | 2022.04.23 |
[백준 17140번] 이차원 배열과 연산(파이썬) (0) | 2022.04.22 |
댓글 영역