[백준] 20055번 - 컨테이너 벨트 위의 로봇
1차
코드
N,K = map(int,input().split())
belt = list(map(int,input().split()))
robots = [0] * N
belt[0] -= 1
robots[0] = 1
cnt = 0
def belt_move():
tmp = belt[-1]
for i in range(2 * N, 0, -1):
if i == 1:
belt[0] = tmp
else:
belt[i - 1] = belt[i - 2]
def robot_move():
for i in range(N-1,-1,-1):
if i == 0:
robots[0] = 0
else:
robots[i] = robots[i-1]
def max_index():
for i in range(N-1,-1,-1):
print("i = ",i)
if robots[i] == 1:
break
return i
while True:
cnt += 1
print("count = ",cnt)
print("기본")
print(belt)
print(robots)
print("1단계")
if robots[-1] == 1:
robots[-1] = 0
belt_move()
robot_move()
if robots[-1] == 1:
robots[-1] = 0
print(belt)
print(robots)
print("2단계")
maxI = max_index()
print("robot 젤 먼저 있는 위치 = ", maxI)
for j in range(maxI+1,-1,-1):
print("j = ",j)
if robots[j] == 1:
if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
robots[j] = 0
robots[j + 1] = 1
belt[j + 1] -= 1 # 이동하는 칸 내구도 1 감소
print(belt)
print(robots)
print("3단계")
if belt[0] != 0:
robots[0] = 1
belt[0] -= 1
print(belt)
print(robots)
print("4단계")
print(list(filter(lambda x : x == 0, belt)))
if len(list(filter(lambda x : x == 0, belt))) >= K:
break
print("final = ",cnt)
초기에 컨테이너 위에 로봇은 하나도 없음
단계를 수행하면서 로봇이 올려지는 것
2차
코드
N,K = map(int,input().split())
belt = list(map(int,input().split()))
robots = [0] * N
cnt = 0
def belt_move():
tmp = belt[-1]
for i in range(2 * N, 0, -1):
if i == 1:
belt[0] = tmp
else:
belt[i - 1] = belt[i - 2]
def robot_move():
for i in range(N-1,-1,-1):
if i == 0:
robots[0] = 0
else:
robots[i] = robots[i-1]
def max_index():
for i in range(N-1,-1,-1):
if robots[i] == 1:
break
return i
while True:
cnt += 1
#1단계
if robots[-1] == 1:
robots[-1] = 0
belt_move()
robot_move()
if robots[-1] == 1:
robots[-1] = 0
#2단계
maxI = max_index()
for j in range(maxI+1,-1,-1):
if robots[j] == 1:
if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
robots[j] = 0
robots[j + 1] = 1
belt[j + 1] -= 1 # 이동하는 칸 내구도 1 감소
#3단계
if belt[0] != 0:
robots[0] = 1
belt[0] -= 1
#4단계
if len(list(filter(lambda x : x == 0, belt))) >= K:
break
print(cnt)
시간초과
-> 스스로도 시간초과가 나겠구나 생각하긴 했음..ㅜㅜ
3차
아이디어
1) sys 사용 -> input시간 축소
기존
N = map(int,input().split()
수정
import sys
N = map(int,sys.stdin.readline().split())
2) 시간초과를 줄이기 위해 deque를 사용해보려고 한다..!
이때, deque에 rotate라는 함수가 있다는 것을 알게 되었다..매우 유용하게 쓰일것 같다..!!
deque.rotate(num) = num만큼 회전한다(양수면 오른쪽으로, 음수면 왼쪽으로)
3) count함수 사용으로 0값 체크
list.count(num) = list에 num이 몇 개인지 count해줌
코드
from collections import deque
import sys
N,K = map(int,sys.stdin.readline().split())
belt = deque(list(map(int,sys.stdin.readline().split())))
robots = deque([0] * N)
cnt = 0
def max_index():
for i in range(N-1,-1,-1):
if robots[i] == 1:
break
return i
while True:
cnt += 1
#1단계
if robots[-1] == 1:
robots[-1] = 0
belt.rotate()
robots.rotate()
if robots[-1] == 1:
robots[-1] = 0
#2단계
maxI = max_index()
for j in range(maxI+1,-1,-1):
if robots[j] == 1:
if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
robots[j] = 0
robots[j + 1] = 1
belt[j + 1] -= 1 # 이동하는 칸 내구도 1 감소
#3단계
if belt[0] != 0:
robots[0] = 1
belt[0] -= 1
#4단계
if belt.count(0) >= K:
break
print(cnt)
Author And Source
이 문제에 관하여([백준] 20055번 - 컨테이너 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yerimstar/백준-20055번-컨테이너-벨트-위의-로봇저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)